繁体   English   中英

比较OpenXML中的两个XML元素

[英]Comparing Two XML Elements In OpenXML

我是XML和C#的新手,因此在实现以下内容时遇到了一些麻烦。 希望有人可以指出正确的方向。 因此,我正在使用带有OpenXML 2.5的C#语言进行开发,并且在创建字体后尝试检查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

任何帮助,将不胜感激!

谢谢,贾斯汀

签出XPath以查询XMLDocuments,然后可以将XMLDocument上的FindNode()与XPath查询一起使用。

但是,它不会返回索引号。 除非另有指示,否则XML节点不会排序,因此不会说“它是第三个”,因为下次您看它可能是第五个! (可能不是,但是这样的行为在XML规范之内)。 但是,您可以做的是获取实际的node(),从中可以获取包含该节点的parent()节点。

感谢帮助,但实际上从sdk中找到了一种更简单的方法。 事实证明,每个OpenXml对象都有一个称为OuterXml的方法。

根据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.更好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;
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM