2017-02-22 62 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

相關問題