LINQ to XML NAVIGATING FILE

时间:2014-08-21 15:35:26

标签: c# linq-to-xml

我是LinQ to XML的新手,我在使用Xdocument(在本例中)从XML文件中提取特定值时遇到了麻烦,并且至少从将其返回到控制台开始。

在XLM中,我只需要显示某些值; 4GB493594008000-JENEXP18082014A,A1,20(在statisticsValue元素中)等。

任何指针都将非常感谢 - 谢谢。

有问题的XML是

  <?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

1 个答案:

答案 0 :(得分:0)

您的XML具有在不同级别声明的不同默认命名空间,您需要非常小心才能看到哪个元素在哪个命名空间中。

如果您不知道,默认命名空间将派生到后代元素。均值,默认名称空间声明的元素及其所有没有前缀且没有不同默认名称空间声明的后代被认为是在同一名称空间(祖先的名称空间)中。例如,由于没有前缀或不同的默认命名空间声明,<acceptanceResponse>元素在其父级的名称空间中被考虑,即#34; demo.com/test/DeclarationGbResponse"。

要选择命名空间中的元素,您可以使用&#34; XNamespace +元素的本地名称&#34; :

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);