1

假设这个简单的 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 表达式,这似乎是相当难以捉摸的。非常感谢任何帮助!

4

2 回答 2

1

尝试这个:

/*/*

它选择根节点的子节点。

或者

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

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

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

于 2013-10-22T21:47:15.287 回答
0

走树

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

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

于 2013-10-22T21:51:58.480 回答