LINQ to XML - Reading XML Document

混江龙づ霸主 提交于 2019-12-23 04:12:22

问题


Could someone please help me how to read the XML Document below using Linq to XML please?

<?xml version='1.0' encoding='UTF-8' ?>
<cXML>
<Request>
<OrderRequest>
  <OrderRequestHeader orderID="xy1234" orderDate="2007-01-1T15:5400+10:00" type="new" orderVersion="001">
    <Total>
      <Money currency="NZ">34.06</Money>
    </Total>
    <ShipTo>
      <Address>
        <Name xml:lang="en">xyz</Name>
        <PostalAddress name="xyz">
          <Street>xyz street</Street>
          <City>xyz</City>              
        </PostalAddress>
      </Address>
    </ShipTo>
    <BillTo>
      <Address>
        <Name xml:lang="en">XYZ</Name>
        <PostalAddress name="XYZ">
          <Street>PO BOX 1234</Street>
          <City>xyz</City>
          <State>xyz state</State>              
        </PostalAddress>
      </Address>
    </BillTo>
    <Contact role="xxx" addressID="123456789">
      <Name xml:lang="en">XYZ</Name>
      <Email name="business">XYZ@ms.com.nz</Email>
      <Phone>
        <TelephoneNumber>
          <Number>1234-1234</Number>
        </TelephoneNumber>
      </Phone>
    </Contact>
    <Contact role="ShipTo">
      <Name xml:lang="en">XYZ</Name>
    </Contact>
    <Contact role="Supplier">
      <Name xml:lang="en">XYZ pty ltd</Name>
    </Contact>
  </OrderRequestHeader>
  <ItemOut quantity="20" lineNumber="1" requestedDeliveryDate="2007-01-01T00:0000+10:00">
    <ItemID>
      <SupplierPartID>12345678</SupplierPartID>
    </ItemID>
    <ItemDetail>
      <UnitPrice>
        <Money currency="NZ">32</Money>
      </UnitPrice>
      <Description xml:lang="en">abc description</Description>
      <UnitOfMeasure>CU</UnitOfMeasure>
      <Classification domain="N/A"/>
      <ManufacturerPartID>12345678</ManufacturerPartID>
      <Extrinsic name="StockCode">12345</Extrinsic>
      <Extrinsic name="Quantity">1</Extrinsic>          
    </ItemDetail>
  </ItemOut>
  <ItemOut quantity="10" lineNumber="2" requestedDeliveryDate="2007-01-01T00:0000+10:00">
    <ItemID>
      <SupplierPartID>12345678</SupplierPartID>
    </ItemID>
    <ItemDetail>
      <UnitPrice>
        <Money currency="NZ">32</Money>
      </UnitPrice>
      <Description xml:lang="en">abc description</Description>
      <UnitOfMeasure>CU</UnitOfMeasure>
      <Classification domain="N/A"/>
      <ManufacturerPartID>12345678</ManufacturerPartID>
      <Extrinsic name="StockCode">23333</Extrinsic>
      <Extrinsic name="Quantity">1</Extrinsic>
    </ItemDetail>
  </ItemOut>
</OrderRequest>

I tried with this code, but it's giving either null or object reference not set error:

XDocument xdoc = XDocument.Load(@"C:\PO.xml");
 var itemOut = (from c in xdoc.Descendants("OrderRequest")

                               select new
                               {
                                   SupplierID = c.Element("Money").Value                               ,
                                   Currency = c.Attribute("currency").Value,
                                   Money = c.Element("Money").Value,
                                   Description = c.Element("Description").Value,
                                   ManufacturerPartID = c.Element("ManufacturerPartID").Value,
                                   Extrinsic = c.Attribute("name").Value
                               });

                foreach (var element in itemOut)
                {
                    Console.WriteLine(element.SupplierID);
                }

                Console.ReadLine();

回答1:


Well it is not clear or rather you have not explained which data you are interested in. However the "OrderRequest" element you currently select does not seem the one having any of the attributes or child elements you are trying to access so I suspect doing

var itemOut = from c in xdoc.Descendants("ItemOut")

                               select new
                               {
                                   SupplierID = c.Element("ItemID").Element("SupplierPartID").Value                               ,
                                   Currency = c.Element("ItemDetail").Element("UnitPrice").Element("Money").Attribute("currency").Value,
                                   Money = (double)c.Element("ItemDetail").Element("UnitPrice").Element("Money"),
                                   Description = c.Element("ItemDetail").Element("Description").Value,
                                   ManufacturerPartID = c.Element("ItemDetail").Element("ManufacturerPartID").Value
                               };

is closer to what you want to achieve. I couldn't figure which "Extrinsic" element you want so I left that out.



来源:https://stackoverflow.com/questions/6167541/linq-to-xml-reading-xml-document

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!