2014-10-08 26 views
0

我想讀取DivaURI鍵的值,但我無法做到這一點。我嘗試了很多東西。我想要達到userProperties子類別。最後要讀取DivaURI鍵的值。如何讀取XML中的子類別

這裏是一個類別的XElement:

<CfgDN> 
    <DBID value="6422" /> 
    <switchDBID value="110" /> 
    <tenantDBID value="101" /> 
    <type value="4" /> 
    <number value="3401" /> 
    <loginFlag value="1" /> 
    <registerAll value="2" /> 
    <groupDBID value="0" /> 
    <trunks value="0" /> 
    <routeType value="1" /> 
    <state value="1" /> 
    <userProperties> 
     <list_pair key="__ROUTER__"> 
     <str_pair key="BackupVDN" value="3921" /> 
     <str_pair key="DivaIVRProfile" value="TS_IVR_Profile" /> 
     <str_pair key="DivaURI" value="I WANT TO READ THIS VALUE!" /> 
     </list_pair> 
     <list_pair key="default"> 
     <str_pair key="monitor_calls" value="true" /> 
     </list_pair> 
     <list_pair key="TServer"> 
     <str_pair key="default-dn" value="43921" /> 
     <str_pair key="router-timeout" value="5" /> 
     </list_pair> 
     <list_pair key="URS_PROD_01"> 
     <str_pair key="Loaded" value="07/25/2012 01:57 PM" /> 
     <str_pair key="Loaded by" value="default" /> 
     <str_pair key="strategy" value="GVP Diva Main Strategy TEST" /> 
     <str_pair key="strategy0x65" value="GVP Diva Main Strategy TEST" /> 
     </list_pair> 
     <list_pair key="URS_PROD_01_81"> 
     <str_pair key="Loaded" value="09/15/2012 06:03 AM" /> 
     <str_pair key="Loaded by" value="default" /> 
     <str_pair key="strategy" value="GVP Diva Main Strategy PROD" /> 
     <str_pair key="strategy0x65" value="GVP Diva Main Strategy PROD" /> 
     </list_pair> 
     <list_pair key="URS_PROD_02"> 
     <str_pair key="Loaded" value="07/25/2012 01:57 PM" /> 
     <str_pair key="Loaded by" value="default" /> 
     <str_pair key="strategy" value="GVP Diva Main Strategy TEST" /> 
     <str_pair key="strategy0x65" value="GVP Diva Main Strategy TEST" /> 
     </list_pair> 
     <list_pair key="URS_PROD_02_81"> 
     <str_pair key="Loaded" value="09/15/2012 06:03 AM" /> 
     <str_pair key="Loaded by" value="default" /> 
     <str_pair key="strategy" value="GVP Diva Main Strategy PROD" /> 
     <str_pair key="strategy0x65" value="GVP Diva Main Strategy PROD" /> 
     </list_pair> 
    </userProperties> 
    <name value="3401" /> 
    <useOverride value="2" /> 
    <switchSpecificType value="1" /> 
    <siteDBID value="0" /> 
    <contractDBID value="0" /> 
</CfgDN> 

也有沒有任何userProperties類別XElements:

<CfgDN> 
    <DBID value="6409" /> 
    <switchDBID value="101" /> 
    <tenantDBID value="101" /> 
    <type value="19" /> 
    <number value="3351" /> 
    <loginFlag value="1" /> 
    <registerAll value="2" /> 
    <groupDBID value="0" /> 
    <trunks value="0" /> 
    <routeType value="1" /> 
    <state value="1" /> 
    <name value="3351_Avaya" /> 
    <useOverride value="2" /> 
    <switchSpecificType value="1" /> 
    <accessNumbers> 
     <CfgDNAccessNumber> 
     <switchDBID value="110" /> 
     <number value="41451" /> 
     </CfgDNAccessNumber> 
     <CfgDNAccessNumber> 
     <switchDBID value="113" /> 
     <number value="41451" /> 
     </CfgDNAccessNumber> 
    </accessNumbers> 
    <siteDBID value="0" /> 
    <contractDBID value="0" /> 
</CfgDN> 

我試圖像這樣,以達到他們:

IEnumerable<XElement> enumElem = from p in xdoc.Descendants("DivaURI") where p.Parent.Name.Equals("userProperties") select p; 
      foreach (XElement child in enumElem) 
      { 
       //XElement elem = enumElem.Current; 
       if (child.Name.LocalName == "DivaURI") 
       { 
        ... 
       } 
      } 

有什麼建議嗎?

回答

1

注意"DivaURI"key屬性的,而不是一個元素名稱

假設只有一個元件,其關鍵字等於"DivaURI",這是一個可能的方式:

XElement str_pair = 
      xdoc.Descendants("str_pair") 
       .FirstOrDefault(o => (string)o.Attribute("key") == "DivaURI"); 
if(str_pair != null) 
    Console.WriteLine((string)str_pair.Attribute("value")); 

UPDATE:

更新的代碼來處理默認命名空間和多<str_pair>元素註釋爲規定:

XNamespace d = "blabla/Configuration/ConfServer/2005/"; 
IEnumerable<string> result = from p in xdoc.Descendants(d+"str_pair") 
          where (string)p.Attribute("key") == "DivaURI" 
          select (string)p.Attribute("value"); 
+0

感謝您的回答,但str_pair返回null – cihata87 2014-10-08 13:22:45

+0

我懷疑你的XML有默認名稱空間(類似'xmlns =「....」')是否正確? – har07 2014-10-08 13:25:01

+0

是的。 - cihata87 2014-10-08 13:26:34

0

嘗試這種情況:

var getValue = from a in xdoc.Descendants("CfgDN").Elements("userProperties").Elements("list_pair").Elements("str_pair") 
         where a.Attribute("key").Value == "DivaURI" 
         select a.Attribute("value").Value; 

輸出:

I WANT TO READ THIS VALUE!

+0

thanx你的注意,但它不返回任何結果lts – cihata87 2014-10-08 13:20:00

+0

@ cihata87它正在爲我工​​作:(。,再次檢查我使用的是你在這裏發佈的XML, – 2014-10-08 13:21:30

+0

它可能適用於唯一的類別。在我的xdoc中有數百個元素。 – cihata87 2014-10-08 13:25:12

相關問題