.net - 如何使用 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 );
}
}
}
解决方案
您需要做的就是将所有后代或元素查询传递给一个名称空间,就像您在第一级所做的那样。
var data =
from d in elements.Descendants(ns + "DataSetMisc")
.Descendants(ns + "vw_Misc_AllData")
select new
{
testKey = (string)d.Element(ns + "TEST_KEY").Value
};
推荐阅读
- java - 安装时打开的 Web 查看 Android 应用程序显示“应用程序停止工作”
- reactjs - 可以在单个 TextInput 中保存多个值吗?
- javascript - 在匹配或替换时排除某些上下文
- python - 无法使用 Python 连接简单的国际空间站 api
- java - 为什么 DEFAULT_NUM_DIRECT_ARENA 派生自 PlatformDependent.maxDirectMemory()?
- json - 在单个请求中发送多种内容类型
- react-native - 无需按下即可调用按钮操作
- swift - 如何从视频 URL 获取视频的 PHAsset?
- django - 如何从 django 中的对象中删除条目
- javascript - 使用 jquery.validation.min.js 进行远程验证