我有一个来自计算机诊断会话的相当大的XML文件,我的目标是获取测试结果数据并将其输入到客户的PDF中。我对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);
填充我的节点列表。
任何人都可以看到我搞砸了命名空间吗?
答案 0 :(得分:1)
您需要为该命名空间中的所有节点使用名称空间前缀。
这是不正确的:/pcd:DiagLog/DiagInfo
。
这是正确的:/pcd:DiagLog/pcd:DiagInfo
。