【问题标题】:How to find an XPath query to Element/Element without namespaces (XmlSerializer, fragment)?如何在没有命名空间(XmlSerializer、片段)的情况下找到对 Element/Element 的 XPath 查询?
【发布时间】:2013-10-22 21:33:37
【问题描述】:

假设这个简单的 XML 片段中可能有也可能没有 xml 声明,并且恰好有一个 NodeElement 作为根节点,紧随其后的是另一个 NodeElement,其中可能包含各种不同数量的分类各种元素。

<?xml version="1.0">
<NodeElement xmlns="xyz">
    <NodeElement xmlns="">
        <SomeElement></SomeElement>
    </NodeElement>
</NodeElement>

在没有命名空间的情况下,如何选择内部 NodeElement 及其内容?例如,"//*[local-name()='NodeElement/NodeElement[1]']"(以及我尝试过的其他变体)似乎没有产生结果。

一般而言,我真正想要完成的事情是Deserialize 包含在XmlDocument 中的更大XML 文档的片段。类似于以下内容

 var doc = new XmlDocument();
 doc.LoadXml(File.ReadAllText(@"trickynodefile.xml")); //ReadAllText to avoid Unicode trouble.
 var n = doc.SelectSingleNode("//*[local-name()='NodeElement/NodeElement[1]']");
 using(var reader = XmlReader.Create(new StringReader(n.OuterXml)))
 {
    var obj = new XmlSerializer(typeof(NodeElementNodeElement)).Deserialize(reader);

我相信我只是缺少正确的 XPath 表达式,这似乎相当难以捉摸。非常感谢任何帮助!

【问题讨论】:

    标签: c# .net xml serialization xpath


    【解决方案1】:

    试试这个:

    /*/*
    

    它选择根节点的子节点。

    或者

    /*/*[local-name() = 'NodeElement']
    

    它选择根节点的local-name() = 'NodeElement' 的子节点。

    无论如何,在您的情况下,两个表达式都选择&lt;NodeElement xmlns=""&gt;

    【讨论】:

      【解决方案2】:

      走树

      foreach(XmlNode node in doc.DocumentElement.childnodes[0].childnodes)
      {
          // do something with node
      }
      

      非常脆弱当然可能想在这里和那里检查空值。

      【讨论】:

        猜你喜欢
        • 2023-01-25
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 2011-11-03
        • 2014-10-09
        • 1970-01-01
        相关资源
        最近更新 更多