我有一个来自计算机诊断会话的相当大的XML文件,我的目标是获取测试结果数据并将其抽成为客户的PDF。我对XML很少有经验,这是一个巨大的问题。使用自定义名称空间获取XML中的子节点
这里是文件的一个样本:
<pcd:DiagLog xmlns="http://www.pc-doctor.com/2004/8/diagLogger"
xmlns:pcd="http://www.pc-doctor.com/2004/8/diagLogger"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.pc-doctor.com/2004/8/diagLogger
http://www.pc-doctor.com/2004/8/diagLogger/diagLogger.xsd">
<Application>
<version>6.0.6818.10</version>
<Start>
<Time hour="04" minute="14" second="01" millisecond="34" month="10" day="15" year="2016" utcOffset="-480">2016-10-15T04:14:01.034-08:00</Time>
</Start>
<OS>Windows 10 Service Pack 0 PE x86 32-bit</OS>
</Application>
.......
<DiagInfo>
....
<TestResult EnglishResult="PASS">
....
</TestResult>
</DiagInfo>
有成千上万</Application>
和<DiagInfo>
之间的线,但我只关注<DiagInfo>
和<TestResult>
找到的信息。
我以为我可以通过简单地抓住节点:
XmlDocument doc = new XmlDocument();
doc.Load(xmlFilePath);
XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("pcd", "http://www.pc-doctor.com/2004/8/diagLogger");
XmlNodeList xnList = doc.SelectNodes("/pcd:DiagLog/DiagInfo", manager);
但这返回一个空列表。当我参考Namespace Manager or XsltContext needed时,它出现我做得很对,但我不认为我是正确地添加名称空间的理解。当我将根元素更改为:<Diagnostics></Diagnostics>
而不是<pcd:DiagLog>
,并尝试:doc.SelectNodes("/Diagnostics/DiagInfo", manager);
我的节点列表已填充。
任何人都可以看到我在搞什么名字空间吗?
@Tomalak是从复制/粘贴错误。我检查了代码和URI匹配.. –