2014-02-06 3 views
0

Я новичок в XML и C#, поэтому у меня мало проблем с реализацией следующего. Надеюсь, кто-то может указать мне в правильном направлении. Поэтому я разрабатываю C# с OpenXML 2.5, и я пытаюсь проверить, после создания шрифта, если этот шрифт уже существует в коллекции шрифтов. Если он уже делает, я хочу вернуть индекс шрифта.Сравнение двух XML-элементов в OpenXML

Я застрял в написании эффективного метода сравнения этих объектов шрифта, и я считаю, что сравнение их соответствующего кода XML - это путь. Я считаю, что эти объекты Font являются оболочками для XML-кода. Поэтому я подумал, что мне нужно сравнить два XML-элемента и выяснить, существует ли Font или нет.

Имеет ли это смысл? Вот пример, потому что я боюсь, что я слишком усложняюсь в своих объяснениях.

1. В принципе, я хочу, чтобы найти, если это:

<x:font> 
    <x:b /> 
    <x:sz val="18" /> 
    <x:color theme="3" /> 
    <x:name val="Cambria" /> 
    <x:family val="2" /> 
    <x:scheme val="major" /> 
    </x:font> 

2. Уже существует здесь:

<x:fonts count="18" x14ac:knownFonts="1" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
    <x:font> 
    <x:sz val="11" /> 
    <x:color theme="1" /> 
    <x:name val="Calibri" /> 
    <x:family val="2" /> 
    <x:scheme val="minor" /> 
    </x:font> 
    <x:font> 
    <x:sz val="11" /> 
    <x:color theme="1" /> 
    <x:name val="Calibri" /> 
    <x:family val="2" /> 
    <x:scheme val="minor" /> 
    </x:font> 
    <x:font> 
    <x:b /> 
    <x:sz val="18" /> 
    <x:color theme="3" /> 
    <x:name val="Cambria" /> 
    <x:family val="2" /> 
    <x:scheme val="major" /> 
    </x:font> 
    <x:font> 
    <x:b /> 
    <x:sz val="15" /> 
    <x:color theme="3" /> 
    <x:name val="Calibri" /> 
    <x:family val="2" /> 
    <x:scheme val="minor" /> 
    </x:font> 
</x:fonts> 

3. И метод возвращает индекс Шрифта. Поэтому в этом примере моя функция вернет 2.

Любая помощь с этим была бы принята с благодарностью!

спасибо, Джастин

ответ

1

Оцените справку, но выясните, как проще это сделать изнутри sdk. Оказывается, существует метод, называемый OuterXml для каждого объекта OpenXml.

Согласно определению Microsoft: OuterXml: Gets the markup that represents the current element and all of its child elements.

Это намного лучше, чем InnerXml: Gets or sets the markup that represents only the child elements of the current element.

Так что я могу просто сделать:

private Stylesheet _stylesheet = _workbookPart.WorkbookStylesPart.Stylesheet; 

public int GetFontIndex(Font font) 
{ 
    int index = 0; 
    foreach (var existingFont in _stylesheet.Descendants<Font>()) 
    { 
     if (font.OuterXml.Equals(existingFont.OuterXml)) return index; 
     index++; 
    } 

    return -1; 
} 
1

ЗАКАНЧИВАТЬ XPath для запроса XMLDocuments, а затем вы можете использовать FindNode() на XMLDocument с запросом XPath.

Однако, что это не будет сделано, верните индексный номер. Если не указано иное, узлы XML не упорядочены, и поэтому идея сказать «это третья» не выполняется, потому что в следующий раз вы посмотрите, что она может быть пятой! (Наверное, нет, но подобное поведение будет соответствовать спецификации XML). Однако вы можете получить фактический узел(), из которого вы можете получить узел parent(), который содержит его.

Смежные вопросы