无法使用命名空间获取 XElement 后代元素值

Unable to get XElement Descendant element value with namespace

在下面的代码中,我将 Id 的值设置为 null,即使它在 xml 片段中。在获得可迭代对象之后,看起来它需要更多的东西来获取价值。非常感谢任何帮助。

 var str =
  @"
<CustomerCareReport xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.FireEms' xmlns:i='http://www.w3.org/2001/XMLSchema-instance'>
  <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Edit</RecordAction>
  <FireIncident xmlns:a='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.FireIncidents'>
    <a:Address xmlns:b='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.Addresses'>
      <b:City>SomeCity</b:City>
      <b:HouseNumber>4019</b:HouseNumber>
      <b:Id>1651880</b:Id>
      <b:Lat>47.573911198</b:Lat>
      <b:LocationType>Address</b:LocationType>
      <b:Lon>-122.169529554</b:Lon>
      <b:State xmlns:c='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.ValidationSets'>
        <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Relate</RecordAction>
        <c:Description>Washington</c:Description>
        <c:EntryValue>WA</c:EntryValue>
        <c:FilterString>WA Washington</c:FilterString>
        <c:Id>85</c:Id>
        <c:Inactive>false</c:Inactive>
        <c:SetId>1021</c:SetId>
      </b:State>
      <b:StreetName>FACTORIA</b:StreetName>
      <b:StreetSuffix>SE</b:StreetSuffix>
      <b:StreetType>BLVD</b:StreetType>
      <b:Venue>
        <b:VenueName>BE</b:VenueName>
      </b:Venue>
      <b:VenueName>BE</b:VenueName>
      <b:Zip>98006</b:Zip>
    </a:Address>
    <a:FDID xmlns:b='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.Jurisdictions'>
      <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Relate</RecordAction>
      <b:Ori>17M02</b:Ori>
    </a:FDID>
    <a:IncidentNumber>2016-00000071</a:IncidentNumber>
  </FireIncident>
  <OtherInformation>
    <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Add</RecordAction>
    <Documents xmlns:a='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.Documents'>
      <a:Document>
        <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Add</RecordAction>
        <a:CheckOutMachine>TROPPLT</a:CheckOutMachine>
        <a:Contents>Z2dn</a:Contents>
        <a:Description>yoyo</a:Description>
        <a:FileType xmlns:b='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.ValidationSets'>
          <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Relate</RecordAction>
          <b:Description>Notepad</b:Description>
          <b:EntryValue>txt</b:EntryValue>
          <b:FilterString>txt Notepad</b:FilterString>
          <b:Id>1</b:Id>
          <b:Inactive>false</b:Inactive>
          <b:SetId>2574</b:SetId>
        </a:FileType>
        <a:Id>0e2821b0-9430-40a8-8964-443cdeeda018</a:Id>
        <a:Name>yoyo</a:Name>
        <a:UsageKey>0</a:UsageKey>
        <a:UsageType>56</a:UsageType>
      </a:Document>
      <a:Document>
        <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Add</RecordAction>
        <a:CheckOutMachine>TROPPLTBKOLLURU</a:CheckOutMachine>
        <a:Contents>ZmhmaA0KZmZmDQpmamZqZmpmDQo=</a:Contents>
        <a:Description>test 2</a:Description>
        <a:FileType xmlns:b='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.ValidationSets'>
          <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Relate</RecordAction>
          <b:Description>Notepad</b:Description>
          <b:EntryValue>txt</b:EntryValue>
          <b:FilterString>txt Notepad</b:FilterString>
          <b:Id>1</b:Id>
          <b:Inactive>false</b:Inactive>
          <b:SetId>2574</b:SetId>
        </a:FileType>
        <a:Id>9b42f7e0-e0b3-4e83-a466-5862e9cb5bbe</a:Id>
        <a:Name>test 2</a:Name>
        <a:UsageKey>0</a:UsageKey>
        <a:UsageType>56</a:UsageType>
      </a:Document>
    </Documents>
  </OtherInformation>
  <Response>
    <Apparatus xmlns:a='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.Units'>
      <RecordAction xmlns='http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects'>Relate</RecordAction>
      <a:Id>-1672</a:Id>
      <a:UnitNumber>E1</a:UnitNumber>
    </Apparatus>
    <ResponseNumber>1600000071E1</ResponseNumber>
  </Response>
  <Time>
    <CallDatetime>2016-07-01T12:26:34.277-04:00</CallDatetime>
    <DispatchNotifiedDatetime>2016-07-01T12:26:34.277-04:00</DispatchNotifiedDatetime>
  </Time>
</CustomerCareReport>
";

            var xelement = XElement.Parse(str);
            XNamespace ns = xelement.Name.Namespace;
            var documents = xelement.Descendants(ns + "Documents");

            foreach (XElement document in documents)
            {
                if (document.Name.LocalName.Equals("Id"))
                {
                    Console.WriteLine(document.Value);

                }

            }

正如评论中所暗示的,Documents 的子元素中没有本地名称为 Id 的子元素。这是 a:Document 个子元素的子元素。

使用正确的命名空间,您的查询应如下所示:

XNamespace ns = "http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.FireEms"
XNamespace a = "http://schemas.datacontract.org/2004/07/Foo.Bar.Frameworks.Reporting.Stack.Infrastructure.DataObjects.Documents"

var element = XElement.Parse(str);

var ids = element
    .Descendants(ns + "Documents")
    .Descendants(a + "Id");

有关工作演示,请参阅 this fiddle