我是XML和C#的新手,所以我在实现以下方面遇到了一些麻烦。希望有人可以指出我正确的方向。所以我正在使用OpenXML 2.5在C#中进行开发,并且在创建Font之后我试图检查,如果Font中已经存在Font。如果它已经存在,那么我想返回Font的索引。
我坚持写一个有效的方法来比较这些Font对象,我相信比较各自的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。该方法返回Font的索引。所以在这个例子中,我的函数将返回2
。
非常感谢任何帮助!
感谢, 贾斯汀
答案 0 :(得分:1)
检查XPath以查询XMLDocuments,然后可以使用XPath查询在XMLDocument上使用FindNode()。
然而,它不会做的是返回索引号。除非另有指示,否则XML节点不是有序的,所以说“它是第三个”的想法没有完成,因为下次你看它可能是第五个! (可能不是,但这样的行为将符合XML的规范)。但是,你可以做的是从实际的node()中获取包含它的parent()节点。
答案 1 :(得分: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;
}