简体   繁体   English

xml名称空间获取xml元素值

[英]xml namespace get xml element value

i have xml like 我有像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>

I want to have <ns2:Amount> tag value 我想拥有<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;

It gives me error object reference not set to an instance 它给我未设置实例的错误对象引用

The problem is that the ns2 + "Amount" element cannot be found. 问题是找不到ns2 + "Amount"元素。 Therefore, it returns null and you cannot access the Value property of a null object. 因此,它返回null并且您不能访问null对象的Value属性。 Since you load the entire XML inside your elem object, it will "represent" the whole XML, ie starting from the GetBooking element. 由于您将整个XML加载到elem对象中,因此它将“表示”整个XML,即从GetBooking元素开始。 This element does not have a direct child called Amount , therefore asking it to return that element will result in a null object. 该元素没有直接子元素Amount ,因此,要求它返回该元素将导致一个null对象。 Using the Descendants method, the element is searched in the entire sub-tree of the XML and not on the first level. 使用Descendants方法,可以在XML的整个子树中而不是在第一级上搜索元素。

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

Just mentioning that correct xml should look something like: 只是提到正确的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>

This should result in Poco 这应该导致Poco

[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; }
}

In that case 在这种情况下

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

ref : deserialize ref: 反序列化

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM