我正在尝试使用 XmlDocument.SelectSingleNode() 从一些客户提供的 XML 文档中提取一些值。
SelectSingleNode() 采用 XPATH 字符串,非常简单的搜索失败。例如:
<?xml version="1.0"?>
<xmlTicket>
<TicketDataSet xmlns="http://tempuri.org/Ticket.xsd">
<Ticket>
<TicketNumber>0123-456-789</TicketNumber>
...
</Ticket>
</TicketDataSet>
</xmlTicket>
XmlDocument.SelectSingleNode("//TicketNumber") 返回 null。
问题显然是命名空间。如果我从文档中删除 xmlns=,则 XPATH 可以正常工作。如果我使用命名空间中性 XPATH 查询,它们也可以正常工作:
doc.SelectSingleNode("//*[local-name()='TicketNumber']");
但我不能做前者,我宁愿不做后者。
我找到了如何配置命名空间管理器的示例,并试图弄清楚如何使其适用于默认命名空间。
这没有用:
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("", "http://tempuri.org/Ticket.xsd");
var ticketNumberNode = doc.SelectSingleNode("//TicketNumber", nsm);
这没有用:
var nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("default", "http://tempuri.org/Ticket.xsd");
var ticketNumberNode = doc.SelectSingleNode("//default:TicketNumber", nsm);
有任何想法吗?
===
注意:我更新了 XML 以显示更多结构。问题似乎与将默认名称空间应用于文档的部分而不是整个文档有关。