2014-09-11 100 views
1

我對XML喜歡XML命名空間獲取XML元素值

<?xml version="1.0" encoding="UTF-8"?> 
<GetBooking Nmbr="0015151001" Identifier="1771C9A911E98" Version="2006.01" Token="11868765"> 
    <Reservation xmlns="http://www.facebook.org/someurl"> 
     <Extensions> 
     <ns2:ReservationExt xmlns="http://www.facebook.org/someurl xmlns:ns2="http://www.google.com/india"> 
      <ns2:ExtPayTxInfo> 
       <ns2:ReferenceID>35775726</ns2:ReferenceID> 
       <ns2:QueryRPH>35775726NI10054145950</ns2:QueryRPH> 
       <ns2:Status>1</ns2:Status> 
       <ns2:Amount>17.85</ns2:Amount> 
       <ns2:Code>9</ns2:Code> 
       <ns2:TxStatus>1</ns2:TxStatus> 
       <ns2:Timestamp>2014-09-10T05:41:45</ns2:Timestamp> 
       <ns2:EndTimestamp>2014-09-10T05:41:45</ns2:EndTimestamp> 
      </ns2:ExtPayTxInfo> 
     </ns2:ReservationExt> 
     </Extensions> 
    </Reservation> 
    <Success xmlns="http://www.facebook.org/someurl" /> 
</GetBooking> 

我想有<ns2:Amount>標記值

string xml = "";// XML Pasted Above 
XNamespace ns1 = "http://www.facebook.org/someurl"; 
XNamespace ns2 = "http://www.google.com/india"; 

var elem = XElement.Parse(xml); 
var value = elem.Element(ns2 + "Amount").Value; 

它給了我錯誤對象引用未設置爲一個實例

回答

1

問題是找不到ns2 + "Amount"元素。因此,它返回null,並且您不能訪問null對象的Value屬性。由於您在elem對象中加載了整個XML,因此它將「代表」整個XML,即從GetBooking元素開始。此元素沒有直接子元素Amount,因此要求它返回該元素將導致null對象。使用Descendants方法,將在XML的整個子樹中搜索元素,而不是在第一級搜索。

var targets = elem.Descendants(ns2 + "Amount").ToList(); 
var value = ""; 
if (targets.Count > 0) 
    value = targets[0].Value; 
+0

在參考文獻中找不到「Descendant」。 – Shaggy 2014-09-11 07:04:25

+0

@Shaggy,哎呀!糾正了這一點。 – 2014-09-11 07:10:41

+0

爲什麼兩個'..'進入? – Shaggy 2014-09-11 07:18:47

1

剛剛提的是正確的XML應該是這個樣子:

<?xml version="1.0" encoding="UTF-8"?> 
<GetBooking Nmbr="0015151001" Identifier="1771C9A911E98" Version="2006.01" Token="11868765" xmlns:f="http://www.w3.org/TR/html4/" xmlns:ns2="http://www.google.com/india"> 
    <f:Reservation> 
     <f:Extensions> 
     <ns2:ReservationExt > 
      <ns2:ExtPayTxInfo> 
       <ns2:ReferenceID>35775726</ns2:ReferenceID> 
       <ns2:QueryRPH>35775726NI10054145950</ns2:QueryRPH> 
       <ns2:Status>1</ns2:Status> 
       <ns2:Amount>17.85</ns2:Amount> 
       <ns2:Code>9</ns2:Code> 
       <ns2:TxStatus>1</ns2:TxStatus> 
       <ns2:Timestamp>2014-09-10T05:41:45</ns2:Timestamp> 
       <ns2:EndTimestamp>2014-09-10T05:41:45</ns2:EndTimestamp> 
      </ns2:ExtPayTxInfo> 
     </ns2:ReservationExt> 
     </f:Extensions> 
    </f:Reservation> 
    <f:Success/> 
</GetBooking> 

這將導致波科

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
public partial class GetBooking 
{ 
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://www.w3.org/TR/html4/")] 
    public Reservation Reservation { get; set; } 
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://www.w3.org/TR/html4/")] 
    public object Success { get; set; } 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public uint Nmbr { get; set; } 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string Identifier { get; set; } 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public decimal Version { get; set; } 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public uint Token { get; set; } 
} 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.w3.org/TR/html4/")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.w3.org/TR/html4/", IsNullable = false)] 
public partial class Reservation 
{ 
    public ReservationExtensions Extensions { get; set; } 
} 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.w3.org/TR/html4/")] 
public partial class ReservationExtensions 
{ 
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "http://www.google.com/india")] 
    public ReservationExt ReservationExt { get; set; } 
} 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.google.com/india")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.google.com/india", IsNullable = false)] 
public partial class ReservationExt 
{ 
    public ReservationExtExtPayTxInfo ExtPayTxInfo { get; set; } 
} 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.google.com/india")] 
public partial class ReservationExtExtPayTxInfo 
{ 
    public uint ReferenceID { get; set; } 
    public string QueryRPH { get; set; } 
    public byte Status { get; set; } 
    public decimal Amount { get; set; } 
    public byte Code { get; set; } 
    public byte TxStatus { get; set; } 
    public DateTime Timestamp { get; set; } 
    public DateTime EndTimestamp { get; set; } 
} 

在這種情況下

GetBooking booking; 
if (xmlstring.Deserialize(out booking)) 
{ 
    decimal value = booking.Reservation.Extensions.ReservationExt.ExtPayTxInfo.Amount; 
    //do something with the value 
} 

裁判:deserialize

+0

沒有得到你寫的東西。我將如何擁有'GetBooking'類對象? – Shaggy 2014-09-11 08:02:31

+0

通過** Ctrl + C **代碼和**編輯 - 選擇性粘貼 - 粘貼爲Xml類**(需要+ VS2012 rc2)獲得** Poco **。 – Margus 2014-09-11 08:12:32