2016-05-30 92 views
1

我正在尝试使用从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。任何提示,代码示例都会非常有帮助!

回答

5

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>