Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq2Xml-如何获取与节点和子节点相关的_C#_Xml_Linq To Xml - Fatal编程技术网

C# Linq2Xml-如何获取与节点和子节点相关的

C# Linq2Xml-如何获取与节点和子节点相关的,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有这样的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.d

我有这样的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>
其目的是获取所有行的item.arrivalDateTime和item.arrivingCity及其crewMembers.item.employeeId。但是,我不知道如何使用linq…us获取子节点,如果try employeeId=x.Element(s+“employeeId”).Value…,则会出现异常

结果应该是这样的:

2010-11-08T22:48:00.000Z;作战需求文件;020040

2010-11-08T22:48:00.000Z;作战需求文件;09000

2010-11-08T20:29:00.000Z;肯尼迪;0538

2010-11-08T20:29:00.000Z;肯尼迪;097790


问题在于您对子体的使用。您请求的是
元素的所有
子元素,这意味着它将包括以下内容:

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

020040
Y
N
这显然没有
arrivalDateTime
元素,因此出现了问题


替换示例代码中对
元素的
子体
的每次调用可以修复此问题。。。尽管如果实际文档没有所有预期数据,您仍然会失败。

问题在于您使用的是
子体。您请求的是
元素的所有
子元素,这意味着它将包括以下内容:

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

020040
Y
N
这显然没有
arrivalDateTime
元素,因此出现了问题


替换示例代码中对
元素的
子体
的每次调用可以修复此问题。。。尽管如果实际文档没有所有预期数据,您仍然会失败。

已解决

我们只需要更换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");

            }

        }

谢谢大家……

问题解决了

我们只需要更换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");

            }

        }

谢谢大家……

哪里有例外?我怀疑这只是一个缺失的值,但你指出这一点要比我们编写一个完整的程序并运行它容易得多……是的,但是foreach中到底在哪里?堆栈跟踪是什么样子?@Jon Skeet…很抱歉Jon…现在完整的代码和xml…异常发生在“x=>”新块中为了我们的利益,如果此代码进入空中交通管制系统,请在调用之前检查您的XElements是否为null。值从何处获得异常?我怀疑这只是一个缺失的值,但你指出这一点要比我们编写一个完整的程序并运行它容易得多……是的,但是foreach中到底在哪里?堆栈跟踪是什么样子?@Jon Skeet…很抱歉Jon…现在完整的代码和xml…异常发生在“x=>”新块中出于我们的考虑,如果此代码要进入空中交通管制系统,请在调用.Value之前检查您的元素是否为null..谢谢..您认为我是否使用“XmlNodeList elemList=xmlDoc.SelectNodes(//s:crewMembers/s:item”,nsm);“它能解决后代的问题吗?@BiancaFonseca:你可以做到这一点——但考虑到切换到使用
元素
是多么容易,这就是我要做的。当使用LINQ to XML很容易避免XPath时,我不是XPath的超级粉丝……尤其是当涉及到名称空间时。是的。它使用元素运行,但当我试图获得一个ildnode“employeeId=x.Element(s+“employeeId”).Value”@BiancaFonseca:你没有给我们足够的上下文来帮助诊断-如果
x
crewMembers
元素中的
item
元素,它会工作得很好,但是你根本没有说
x
是什么……谢谢……你认为如果我使用
XmlNodeList elemList=xmlDoc.SelectNodes(//s:crewMembers/s:item),nsm;“它能解决后代的问题吗?@BiancaFonseca:你可以做到这一点——但考虑到切换到使用
元素
是多么容易,这就是我要做的。当使用LINQ to XML很容易避免XPath时,我不是XPath的超级粉丝……尤其是当涉及到名称空间时。是的。它使用元素运行,但当我试图获得一个ildnode“employeeId=x.Element(s+“employeeId”).Value”@BiancaFonseca:你没有给我们足够的上下文来帮助诊断-如果
x
crewMembers
元素中的
item
元素,它就可以正常工作,但你根本没有说
x
是什么。。。