c#
  • xml
  • xpath
  • linq-to-xml
  • 2017-05-17 13 views 0 likes 
    0

    次のコードでは、xmlスニペットにある場合でもIdの値をnullにしています。 iterableを取得した後、値を取得するために何かが必要なように見えます。どんな助けでも大歓迎です。コメントで示唆したようネームスペースでXElement Descendantの要素値を取得できません

    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); 
    
           } 
    
          } 
    
    +1

    'foreach(XElementドキュメントin documents.Descendants())'? –

    +1

    要素文書にはIDがありません。だから試してみてください:foreach(xelement.Descendants()内のXElementドキュメント) – jdweng

    +0

    クイックチェックをしましたか? Btw私はまた、ドキュメント内の2つのIDを区別しなければなりません。 1つはInteget値を持ち、もう1つは外側の入れ子にGUID値を持っています。私は手を差し伸べて、その中のGUID値を持つIdだけを取得する必要があります。私は名前空間が2つを区別するように設定されなければならないと推測しています。 – bkolluru

    答えて

    1

    Idのローカル名を持つDocumentsのない子要素はありません。これは子供の子供です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を参照してください。

    +0

    チャールズありがとうございました。私はJSFiddleについてしか知りませんでした。私をdotnetfiddleに向ける+1。あなたの回答はすでに回答済みですが、さらに質問があります。私はxelement.Name.Namespaceを使ってそれをハードコーディングせずにルート名前空間を得ることができます。しかし、クエリのa:namespaceをハードコーディングする必要がありました。 Name.Namespaceを使ってもそれを得る方法はありますか? – bkolluru

    +0

    本当にありません。しかし、あなたはローカルの名前(Documents、Id)をハードコーディングしているので、名前空間はどうしてでしょうか?彼らはどちらも修飾された名前を作り、どちらも変わることはありません。 –

    関連する問題