简体   繁体   中英

LINQ to XML NAVIGATING FILE

I am new to LinQ to XML and I am having trouble using Xdocument (in this case) to extract specific values from an XML file and to start with at least return it to a console.

In the XLM I need to display only certain values; 4GB493594008000-JENEXP18082014A, A1, 20 (in the statisticalValue element) etc.

Any pointers would be greatly appreciated - thanks.

The XML in question is

  <?xml version="1.0" encoding="utf-8"?>
<declarationGbResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="demo.com/test/DeclarationGbResponse">
  <declarationIdentity>
    <declarationUcr xmlns="demo.org.uk/DeclarationGbIdentityType">4GB493594008000-JENEXP18082014A</declarationUcr>
  </declarationIdentity>
  <responseType>ACC</responseType>
  <responseTime>2014-08-18T13:36:32.79</responseTime>
  <isFirstAcceptanceResponse>true</isFirstAcceptanceResponse>
  <externalReferences/>
  <!-- element -->
  <acceptanceResponse>
  <!-- element -->
    <ICS xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">A1</ICS>
    <entryRoute xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">H</entryRoute>
    <statusOfExportEntry xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">1</statusOfExportEntry>
    <entryTime xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">2014-08-18T13:36:00</entryTime>
    <entryEpuNumber xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">120</entryEpuNumber>
    <entryNumber xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">A05605F</entryNumber>
    <entryVersionNumber xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">1</entryVersionNumber>
    <movementReferenceNumber xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">14GB08X33073603018</movementReferenceNumber>
    <declarationExchangeRate xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">1</declarationExchangeRate>
    <declarationCurrency xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">
      <currencyCode xmlns="demo.org.uk/test/Currency">GBP</currencyCode>
    </declarationCurrency>
    <customsValueForDuty xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">
      <value xmlns="demo.org.uk/test/MonetaryType">20</value>
    </customsValueForDuty>
    <customsDutyPayable xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">
      <value xmlns="demo.org.uk/test/MonetaryType">0</value>
    </customsDutyPayable>
    <deferedRevenue xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">
      <value xmlns="demo.org.uk/test/MonetaryType">0</value>
    </deferedRevenue>
    <immediateRevenue xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">
      <value xmlns="demo.org.uk/test/MonetaryType">0</value>
    </immediateRevenue>
    <revenuePayable xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">
      <value xmlns="demo.org.uk/test/MonetaryType">0</value>
    </revenuePayable>
    <itemResponses xmlns="demo.org.uk/test/DeclarationGbAcceptanceResponse">
      <itemResponse>
        <itemNumber xmlns="demo.org.uk/test/DeclarationGbItemResponse">1</itemNumber>
        <statisticalValue xmlns="demo.org.uk/test/DeclarationGbItemResponse">
          <value xmlns="demo.org.uk/test/MonetaryType">20</value>
        </statisticalValue>
      </itemResponse>
    </itemResponses>
  </acceptanceResponse>
</declarationGbResponse

Your XML has different default namespaces declared at various level, you need to be very careful to be able to see which element is in which namespace.

In case you didn't know, default namespace is derived to descendant elements. Means, the element where default namespace declared and all of it's descendants without prefix and without different default namespace declaration are considered in the same namespace, the ancestor's namespace. For example, because of not having prefix or different default namespace declaration, <acceptanceResponse> element considered in the namespace of it's parent which is "demo.com/test/DeclarationGbResponse".

To select element in namespace, you can use " XNamespace +element's local name" :

XDocument doc = /* load your XML to XDocument */
XNamespace gbResponse = "demo.com/test/DeclarationGbResponse";
XNamespace gbIdentityType = "demo.org.uk/DeclarationGbIdentityType";
XNamespace gbAcceptanceRespons = "demo.org.uk/test/DeclarationGbAcceptanceResponse";
XNamespace gbItemResponse = "demo.org.uk/test/DeclarationGbItemResponse";
XNamespace monetaryType = "demo.org.uk/test/MonetaryType";
var declarationUcr = (string)doc.Root
                                .Element(gbResponse + "declarationIdentity")
                                .Element(gbIdentityType + "declarationUcr");
var ICS = (string)doc.Root
                     .Element(gbResponse + "acceptanceResponse")
                     .Element(gbAcceptanceRespons + "ICS");
var value = (string)doc.Root
                       .Element(gbResponse + "acceptanceResponse")
                       .Element(gbAcceptanceRespons + "itemResponses")
                       .Element(gbAcceptanceRespons + "itemResponse")
                       .Element(gbItemResponse + "statisticalValue")
                       .Element(monetaryType + "value");
Console.WriteLine(declarationUcr);
Console.WriteLine(ICS);
Console.WriteLine(value);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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