如何查找对没有命名空间的元素/元素的 XPath 查询(XmlSerializer、片段)

本文关键字:元素 XPath XmlSerializer 片段 查询 何查找 查找 命名空间 | 更新日期: 2023-09-27 18:36:31

>假设这个简单的XML片段,其中可能有也可能没有xml声明,并且只有一个NodeElement作为根节点,后跟一个其他NodeElement,其中可能包含各种不同数量的不同类型的元素。

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

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

至于一般来说,我真正想要完成的事情是反序列化 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 表达式,这似乎相当难以捉摸。任何帮助非常感谢!

如何查找对没有命名空间的元素/元素的 XPath 查询(XmlSerializer、片段)

试试这个:

/*/*

它选择根节点的子节点。

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

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

无论如何,在您的情况下,两个表达式都选择 <NodeElement xmlns=""> .

走树

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

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