如何查找对没有命名空间的元素/元素的 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 表达式,这似乎相当难以捉摸。任何帮助非常感谢!
试试这个:
/*/*
它选择根节点的子节点。
或
/*/*[local-name() = 'NodeElement']
它选择具有根节点local-name() = 'NodeElement'
的子节点。
无论如何,在您的情况下,两个表达式都选择 <NodeElement xmlns="">
.
走树
foreach(XmlNode node in doc.DocumentElement.childnodes[0].childnodes)
{
// do something with node
}
当然,非常脆弱的人可能想在这里和那里检查空值。