2014-02-06 138 views
0

我是XML和C#的新手,所以我在實現以下方面遇到了一些麻煩。希望有人能指出我正確的方向。所以我用C#開發OpenXML 2.5,並且在創建Font之後,如果該Font已經存在於Font集合中,我試圖檢查它。如果它已經這樣做,那麼我想返回字體的索引。在OpenXML中比較兩個XML元素

我被困在編寫一個有效的方法來比較這些字體對象,我相信比較他們各自的XML代碼是要走的路。我相信這些Font對象是XML代碼的包裝器。所以我認爲我應該能夠比較兩個XML元素並確定該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> 

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> 

並且該方法返回索引的字體。所以在這個例子中,我的函數將返回2

任何幫助,將不勝感激!

感謝, 賈斯汀

回答

1

欣賞幫助,但想出了一個更簡單的方法來實際從sdk內部執行此操作。原來,每個OpenXml對象都有一個叫做OuterXml的方法。

根據微軟的定義: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,然後你就可以與XPath查詢XmlDocument的使用FindNode()。

但是,它不會做的是返回索引號。除非另有指示,否則XML節點不會被排序,因此它說「這是第三個」的想法沒有完成,因爲下次你看它可能是第五個! (可能不會,但是這樣的行爲將在XML規範之內)。但是,您可以執行的操作是獲取實際節點(),您可以從中獲取包含它的父節點()。