簡體   English   中英

Linq2Xml-如何獲取相關的節點和子節點

[英]Linq2Xml - how to get nodes and childnodes related

我有這樣的XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
  <supplyCrew xmlns="http://site.ddf.com">
     <login>
        <login>XXXX</login>
        <password>XXXX</password>
     </login>
     <flightInformation>
        <flights>
           <item>
              <arrivalDateTime>2010-11-08T22:48:00.000Z</arrivalDateTime>
              <arrivingCity>ORD</arrivingCity>
              <crewMembers>
                 <item>
                    <employeeId>020040</employeeId>
                    <isDepositor>Y</isDepositor>
                    <isTransmitter>N</isTransmitter>
                 </item>
                 <item>
                    <employeeId>09000</employeeId>
                    <isDepositor>N</isDepositor>
                    <isTransmitter>Y</isTransmitter>
                 </item>
              </crewMembers>
           </item>
           <item>
              <arrivalDateTime>2010-11-08T20:29:00.000Z</arrivalDateTime>
              <arrivingCity>JFK</arrivingCity>
              <crewMembers>
                 <item>
                    <employeeId>0538</employeeId>
                    <isDepositor>Y</isDepositor>
                    <isTransmitter>N</isTransmitter>
                 </item>
                 <item>
                    <employeeId>097790</employeeId>
                    <isDepositor>N</isDepositor>
                    <isTransmitter>Y</isTransmitter>
                 </item>
              </crewMembers>
           </item>
        </flights>
     </flightInformation>
  </supplyCrew>

此代碼僅獲取第一個項目“和”,然后生成異常“ System.NullReferenceException”。

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Xml.Linq;
using System.Text;
using System.Xml;
using System.Data.SqlClient;
using System.Data;
using System.IO;

namespace ConsoleApplication1
{

class Program
{ 

  static void Main(string[] args)
    {


        XElement doc = XElement.Load("U:/Crew.xml");
        XNamespace e = "http://schemas.xmlsoap.org/soap/envelope/";
        XNamespace s = "http://site.ddf.com";

                   var flights = doc.Elements(e + "Body")
        .Elements(s + "supplyCrew")
        .Elements(s + "flightInformation")
        .Elements(s + "flights")
        .Elements(s + "item")
        .Select(
        flight_item => new
        {
            //Anonymous Type
            arrivalDateTime = flight_item.Element(s + "arrivalDateTime").Value,
            arrivingCity = flight_item.Element(s + "arrivingCity").Value,
            crewmember = flight_item.Elements(s + "crewMembers").Elements(s + "item"),

        }
        );


        int index = 1;
        foreach (var flight_item in flights)
        {

            Console.Write('\n'+"New flight item:"+'\n');
            Console.Write('\t'+flight_item.arrivalDateTime + '\n');
            Console.Write('\t'+flight_item.arrivingCity + '\n');

            foreach (var item in flight_item.crewmember)
            {
                var employeeId = item;//crewmember.Elements(s + "item").Elements("employeeId");
                Console.Write("\t  "+employeeId);
                Console.Write('\n');
                //index++;
            }

        }

這個想法是為所有行獲取item.arrivalDateTime和item.arrivingCity及其crewMembers.item.employeeId。 但是,我不知道如何使用linq獲取子節點。如果嘗試employeeId = x.Element(s +“ employeeId”)。Value,則會發生異常。...

結果應該是這樣的:

2010-11-08T22:48:00.000Z; ORD; 020040

2010-11-08T22:48:00.000Z; ORD; 09000

2010-11-08T20:29:00.000Z; 肯尼迪國際機場; 0538

2010-11-08T20:29:00.000Z; 肯尼迪國際機場; 097790

問題出在您使用Descendants 您要查詢flights元素的所有子item -這意味着它將包括以下內容:

<item>
   <employeeId>020040</employeeId>
   <isDepositor>Y</isDepositor>
   <isTransmitter>N</isTransmitter>
</item>

顯然,它沒有arrivalDateTime元素,因此是問題所在。

在示例代碼中替換對DescendantsElements每次調用都可以解決問題……盡管如果實際文檔沒有所有預期數據,您仍然會失敗。

解決了

我們只需要將foreach替換為:

        foreach (var flight_item in l_flights)
        {

            Console.Write('\n'+"New flight item:"+'\n');
            Console.Write('\t'+flight_item.arrivalDateTime + '\n');
            Console.Write('\t'+flight_item.arrivingCity + '\n');

            foreach (var item in flight_item.crewmember)
            {
                var employeeId = item.Element(s + "employeeId").Value;
                var isDepositor = item.Element(s + "isDepositor").Value;
                var isTransmitter = item.Element(s + "isTransmitter").Value;

                Console.Write("\t  " + employeeId + "\n");
                Console.Write("\t  " + isDepositor + "\n");
                Console.Write("\t  " + isTransmitter + "\n");

            }

        }

感謝大伙們....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM