首页 > 解决方案 > 如何使用 Linq 在带有命名空间的嵌套 XML 中获取后代

问题描述

我在导航这个复杂的 xml 模式以获取 vw_Misc_AllData 标记的后代时遇到问题。我以为我可以直接导航到我需要的标签部分,但它不能正常工作。有人可以查看我的 .Net Fiddle 并让我知道出了什么问题吗?

        using System;
        using System.Linq;
        using System.Xml.Linq;

        public class Program
        {
            public static void Main()
            {
                    string xml = @"<getMiscDataResult xmlns='http://tempuri.org/WSMisc/Service1'> 
                                    <xs:schema id='DataSetMisc' targetNamespace='http://www.tempuri.org/DataSetMisc.xsd' xmlns:mstns='http://www.tempuri.org/DataSetMisc.xsd' xmlns='http://www.tempuri.org/DataSetMisc.xsd' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' attributeFormDefault='qualified' elementFormDefault='qualified'> 
                                        <xs:element name='DataSetMisc' msdata:IsDataSet='true' msdata:Locale='en-US' msdata:EnforceConstraints='False'> 
                                            <xs:complexType> 
                                                <xs:choice minOccurs='0' maxOccurs='unbounded'> 
                                                    <xs:element name='vw_Misc_AllData'> 
                                                        <xs:complexType> 
                                                            <xs:sequence> 
                                                            </xs:sequence> 
                                                        </xs:complexType> 
                                                    </xs:element> 
                                                </xs:choice> 
                                            </xs:complexType> 
                                        </xs:element> 
                                    </xs:schema> 
                                    <diffgr:diffgram xmlns:msdata='urn:schemas-microsoft-com:xml-msdata' xmlns:diffgr='urn:schemas-microsoft-com:xml-diffgram-v1'> 
                                        <DataSetMisc xmlns='http://www.tempuri.org/DataSetMisc.xsd'> 
                                            <vw_Misc_AllData diffgr:id='vw_Misc_AllData1' msdata:rowOrder='0'> 
                                                <TEST_KEY>12345</TEST_KEY> 
                                            </vw_Misc_AllData>
                                            <vw_Misc_AllData diffgr:id='vw_Misc_AllData1' msdata:rowOrder='0'> 
                                                <TEST_KEY>12345</TEST_KEY> 
                                            </vw_Misc_AllData>
                                        </DataSetMisc>
                                    </diffgr:diffgram>
                                </getMiscDataResult>
                            ";

                            XDocument elements = XDocument.Parse(xml);
                            XNamespace ns = "http://www.tempuri.org/DataSetMisc.xsd";
                            var data = from d in elements.Descendants(ns + "DataSetMisc").Descendants("vw_Misc_AllData")
                                select new
                                {
                                    testKey = (string) d.Element("TEST_KEY").Value
                                };

                            foreach ( var element in data )
                            {
                                Console.WriteLine( element.testKey );
                            }
            }
        }

标签: .netlinq

解决方案


您需要做的就是将所有后代或元素查询传递给一个名称空间,就像您在第一级所做的那样。

    var data =
        from d in elements.Descendants(ns + "DataSetMisc")
        .Descendants(ns + "vw_Misc_AllData") 
         select new
        {
            testKey = (string)d.Element(ns + "TEST_KEY").Value
        };

小提琴


推荐阅读