2017-02-22 61 views
0

我有一个来自计算机诊断会话的相当大的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);我的节点列表已填充。

任何人都可以看到我在搞什么名字空间吗?

+0

@Tomalak是从复制/粘贴错误。我检查了代码和URI匹配.. –

回答

1

您需要为该名称空间中的所有节点使用名称空间前缀。

这是不正确的:/pcd:DiagLog/DiagInfo

这是正确的:/pcd:DiagLog/pcd:DiagInfo

+0

是的。就是这样。我不能将答案标记为答案,但那是有效的。 –

+1

默认命名空间传播。显式名称空间不。您的XML使用默认名称空间。严格地说,如果输入XML中没有节点使用'pcd'前缀,则可以抛出该命名空间声明,而不会产生不良影响。您也不需要在C#中调用该命名空间'pcd'。你可以给它任何你想要的句柄,只有URI需要匹配。 – Tomalak

相关问题