使用LINQ到XML解析xsd从WSDL使用LINQ到XML
问题描述:
我正在尝试使用从WSDL定义中使用LINQ to XML获取的XSD文件来构建字典。使用LINQ到XML解析xsd从WSDL使用LINQ到XML
而我试图解析节点是这个样子
<xsd:element maxOccurs="1" minOccurs="0" name="active" type="xsd:boolean"/>
<xsd:element maxOccurs="1" minOccurs="0" name="activity_due" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="additional_assignee_list" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="approval" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="approval_history" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="approval_set" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="assigned_to" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="assignment_group" type="xsd:string"/>
到XML文件中的链接是:https://dl.dropboxusercontent.com/u/97162408/incident.xml
我只担心“getKeys”。
基本上想要建立一个字典,它会给我一个来自上面的示例节点列表的“名称”和“类型”的键值对。
我已经到了一个地步,我可以使用代码
XNamespace ns = XNamespace.Get("http://www.w3.org/2001/XMLSchema");
XDocument xd = XDocument.Load(url);
var result = (from elements in xd.Descendants(ns + "element") where elements.Attribute("name").Value.Equals("getKeys")
select elements.Descendants(ns + "sequence")
);
现在我想建立在一个函数调用词典,而无需编写另一个程序在结果列表解析得到的节点列表使用LINQ to XML。任何提示,代码示例都会非常有帮助!
答
ToDictionary
是你的朋友在这里。你可以做到这一切在一个声明:
var query = xd
.Descendants(ns + "element")
.Single(element => (string) element.Attribute("name") == "getKeys")
.Element(ns + "complexType")
.Element(ns + "sequence")
.Elements(ns + "element")
.ToDictionary(x => (string) x.Attribute("name"),
x => (string) x.Attribute("type"));
基本上前三行找到的getKeys
名称的唯一元素,未来二,三线选择其下的xsd:element
部分(你可以只,如果你使用Descendants(ns + "element")
想要的),最后的调用将元素序列转换为Dictionary<string, string>
。