2015-11-25 44 views
0

我想進入一個特定路徑'/ trace/calls/call/userTableParameters/parameter',並取出所有帶有值的參數名稱。我在使用xmlnode選擇時在xpath中使用了一個名稱空間。它返回正確的魚子節點「參數」。但xmlnodelist不會進一步返回任何內容。我的代碼中會出現什麼問題?XmlNodeList是空的,在C#代碼中的NameSpace

XmlDocument doc = new XmlDocument(); 
    doc.Load(@"d:\Drops.xml"); 

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
    nsmgr.AddNamespace("nsTrace", "http://www.polystar.com/OSIX/monitoring/traceSchemaV1.0"); 
    XmlNode ParameterNode = doc.SelectSingleNode("//nsTrace:userTableParameters", nsmgr); 
    XmlNodeList ParameterNodeList = ParameterNode.SelectNodes("//parameter"); 

    foreach (XmlNode node in ParameterNodeList) 
      { 
       Parameter drop = new Parameter(); 
       drop.name = node.Attributes.GetNamedItem("name").Value; 
       drop.content = node.InnerText; 

       callParameter.ParameterList.Add(drop); 
      } 


    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<trace xmlns="http://www.polystar.com/OSIX/monitoring/traceSchemaV1.0"> 
    <calls> 
     <call> 
      <messages> 
       <message> 
        <parameters> 
         <parameter name="Timestamp">Wed 11 Nov 2015 11:58:14.096</parameter> 
         <parameter name="Direction">---&gt;</parameter> 
         <parameter name="Resulting Status">Normal</parameter> 
         <parameter name="Resulting State Name">AP Request Pending</parameter> 
         <parameter name="Source Address">11.111.111.11</parameter> 
         <parameter name="Dest Address">11.222.222.22; ABC2</parameter> 
         <parameter name="Media Probe Id"/> 
         <parameter name="Deciphered"/> 
        </parameters> 
       </message> 
      </messages> 
      <userTableParameters> 
       <parameter name="Start Time">11:58:14.096</parameter> 
       <parameter name="End Time">11:58:27.191</parameter> 
       <parameter name="Duration">00:00:13.095</parameter> 
       <parameter name="Date">Wed 11 Nov 2015</parameter> 
       <parameter name="Protocol">AP</parameter> 
       <parameter name="Status">End</parameter> 
       <parameter name="AP II"/> 
       <parameter name="AP TI">e0a5e84d'H</parameter> 
       <parameter name="AP Cause">3; due-to-generated-reason</parameter> 
      </userTableParameters> 
     </call> 
    </calls> 
</trace> 
+1

嘗試包括所有查詢的命名空間,例如 更多信息 XmlNodeList ParameterNodeList = ParameterNode.SelectNodes(「// nsTrace:parameter」); – ColinM

+0

命名空間矯枉過正的另一種情況 –

回答

1

您的Xpath查詢是錯誤的。 我也縮短了你的代碼。約Xpath

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
nsmgr.AddNamespace("nsTrace","http://www.polystar.com/OSIX/monitoring/traceSchemaV1.0"); 
XmlNodeList ParameterNodeList = doc.SelectNodes("//nsTrace:userTableParameters//nsTrace:parameter", nsmgr); 
+0

這是用名稱空間標識正確xpath的訣竅! 「// nsTrace:userTableParameters // nsTrace:參數」。任何MSDN或網站是否可以提供更多示例和定義? –

+0

實際上我在asnwer中共享了一個鏈接(來自[w3school](http://www.w3schools.com/xsl/xpath_syntax.asp))。您還可以查看這些頁面 [w3.org](http://www.w3.org/TR/xpath) [msdn](https://msdn.microsoft.com/zh-cn/library/ms256086 (v = vs.110).aspx)@AnsonLeung –