C# 检索子节点值

C# 检索子节点值,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,下面是我正在使用的XML LineItemDetails有多个实例,我只发布了其中一个 <LineItemDetail> <DetailNumber>1</DetailNumber> <LineItemNumber>1</LineItemNumber> <BatchSequenceNumber>1</BatchSequenceNumber> <RecordSequenc

下面是我正在使用的XML LineItemDetails有多个实例,我只发布了其中一个

<LineItemDetail>
    <DetailNumber>1</DetailNumber> 
    <LineItemNumber>1</LineItemNumber> 
    <BatchSequenceNumber>1</BatchSequenceNumber> 
    <RecordSequenceWithinBatch>1</RecordSequenceWithinBatch> 
    <ChargeAmount Name="GrossBilled">365.380</ChargeAmount> 
    <Tax>
        <TaxType>Tax</TaxType> 
        <TaxAmount Name="Billed">15.630</TaxAmount> 
        <TaxBreakdown>
            <TaxCode>MN</TaxCode> 
            <TaxAmount Name="Billed">15.630</TaxAmount> 
        </TaxBreakdown>
    </Tax>
    <AddOnCharges>
        <AddOnChargeName>ISCAllowed</AddOnChargeName> 
        <AddOnChargePercentage>-9</AddOnChargePercentage> 
        <AddOnChargeAmount>-32.880</AddOnChargeAmount> 
    </AddOnCharges>
    <TotalNetAmount>348.130</TotalNetAmount> 
    <CouponDetails>
        <TicketOrFIMIssuingAirline>160</TicketOrFIMIssuingAirline> 
        <TicketOrFIMCouponNumber>1</TicketOrFIMCouponNumber> 
        <TicketDocOrFIMNumber>2649488544</TicketDocOrFIMNumber> 
        <CheckDigit>6</CheckDigit> 
        <CurrAdjustmentIndicator>USD</CurrAdjustmentIndicator> 
        <ElectronicTicketIndicator>E</ElectronicTicketIndicator> 
        <AirlineFlightDesignator>MR</AirlineFlightDesignator> 
        <FlightNo>885</FlightNo> 
        <FlightDate>2013-04-03</FlightDate> 
        <FromAirportCode>ULN</FromAirportCode> 
        <ToAirportCode>HKG</ToAirportCode> 
        <SettlementAuthorizationCode>861FBKOPVEZZ4</SettlementAuthorizationCode> 
        <Attachment>
            <AttachmentIndicatorOriginal>N</AttachmentIndicatorOriginal> 
        </Attachment>
    </CouponDetails>
</LineItemDetail>
p、 ElementTaxCOde只检查p元素的直接子元素,所以它什么也找不到

试试看:

foreach (var p in tax)
{
    taxcode= (string)p.Element("TaxBreakdown").Element("TaxCode");
}
我使用了stringXElement转换而不是XElement.Value属性,因为当找不到元素时,它不会抛出NullReferenceException

编辑

示例XML的测试代码:

var doc = XDocument.Load("source.txt");

var lineItemDetails = doc.Descendants("LineItemDetail");

foreach (var lineItemDetail in lineItemDetails)
{
    var tax = lineItemDetail.Element("Tax");
    var taxCode = (string)tax.Element("TaxBreakdown").Element("TaxCode");
}
税码是MN。

试试这个

 foreach (var p in tax)
 {
   taxcode= p.Element("TaxBreakdown").Element("TaxCode").Value;
 }

为什么不尝试使用XmlDocument呢?在文档中加载xml后,您可以这样做,我已将XmlDocument声明为doc:


我写这篇文章只是用我的记忆,所以如果我犯了一些语法或语法错误,我很抱歉

可能是打字错误:TaxCOde?XML中有任何名称空间吗?下面的答案应该是有效的-如果你仍然得到空值,那么我打赌这是一个命名空间问题。仍然不起作用,现在我得到这个错误-对象引用没有设置为对象的实例。当我试着this@user2660107您发布的XML是整个文档还是真实文档的一部分?每个元素的结构是否都与您发布的相同?请参阅原始代码中的更新我发布了LineItemDetail的一个实例。仍然没有结果Ajay。。。。我在doc.Root.genderantstax select t中做了这个var tax=from t;税收{taxcode=p.ElementTaxBreakdown.ElementTaxCode.Value;}我发现以下错误:System.Xml.Linq.XDocument不包含“GetElementsByTagName”的定义,并且找不到接受“System.Xml.Linq.XDocument”类型的第一个参数的扩展方法“GetElementsByTagName”。是否缺少using指令或程序集引用?它不是XDocument,而是XmlDocument,您必须使用添加。将System.Xml放在代码顶部;真正地哇!我的代码在这里工作。。。。在我告诉您的引用中看到名称空间Linq很奇怪。你完成所有这些步骤了吗?1-XmlDocument doc=新的XmlDocument 2-doc.LoadpathtoYourDocument 3-doc.getElementsByTagname?这应该管用!!不确定这是如何回答的,因为它返回TaxType,并且代码OP posted正在查找TaxCode….?thnx kanith。。。。。只是它应该是。。。。。Tax=来自DocumentObject.DegenantStatxBreakDown中的TaxInfo选择TaxInfo;
  XDocument DocumentObject = XDocument.Load(yourxml); 
  IEnumerable<XElement> Tax= from TaxInfo in DocumentObject.Descendants("Tax") select  TaxInfo;

            foreach (var t in Tax)
            {
                TaxType = (string)t.Element("TaxType");

            }
foreach(XmlElement elem in doc.GetElementsByTagName("TaxCOde"))
     taxcode = elem.InnerText;
  XDocument DocumentObject = XDocument.Load(yourxml); 
  IEnumerable<XElement> Tax= from TaxInfo in DocumentObject.Descendants("Tax") select  TaxInfo;

            foreach (var t in Tax)
            {
                TaxType = (string)t.Element("TaxType");

            }