我有一个XML文档(描述了wsdl服务的接口):
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
<s:element name="GetDummyType">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="param1" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetDummyTypeResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetDummyTypeResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="SimplestWebService">
<s:complexType />
</s:element>
<s:element name="SimplestWebServiceResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="SimplestWebServiceResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="SignInComp">
<s:complexType />
</s:element>
<s:element name="SignInCompResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="SignInCompResult" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
...
我需要对上面的xml执行两个操作:
到目前为止,我管理的只是将此文档解析为XmlDocument:
XmlDocument doc = new XmlDocument();
doc.LoadXml(result.ToString());
(我知道并不多)
我无法弄清楚XML是如何映射到你可以使用linq的东西上的。
你是怎样做的?
感谢。
答案 0 :(得分:5)
您需要确保在查询中使用正确的XML命名空间。
此外,对于LINQ to XML,使用XDocument
,而不是XmlDocument
,它来自旧版System.Xml
。
到目前为止,这是我设法提出的:
XDocument doc = XDocument.Parse(xml);
XNamespace wsdl = "http://schemas.xmlsoap.org/wsdl/";
XNamespace s = "http://www.w3.org/2001/XMLSchema";
var schema = doc.Root
.Element(wsdl + "types")
.Element(s + "schema");
var elements = schema.Elements(s + "element");
Func<XElement, string> getName = (el) => el.Attribute("name").Value;
// these are all method names
var names = from el in elements
let name = getName(el)
where !name.EndsWith("Response")
select name;
string methodName = "GetDummyType";
var method = elements
.Single(el => getName(el) == methodName);
// these are all parameters for a given method
var parameters = from par in method.Descendants(s + "element")
select getName(par);
我已经测试了这段代码,它可以处理您的数据 但是,我并不完全是最简单的解决方案,所以我欢迎任何缩短代码的建议。
最佳,
丹
答案 1 :(得分:2)
对于#1,使用程序集System.Linq.Xml
,你可以这样做:
List<string> names = new List<string>();
XDocument doc = Xdocument.Parse(result.ToString());
foreach (XElement element in doc.Elements("wsdl:types").First().Elements("s:schema").First().Elements("s:element"))
{
names.Add(element.Attributes("name").First().Value);
}
它未经过测试,因此您可能需要调整一下代码;)
顺便说一下,您可以找到有关msdn concerning System.Xml.Linq
的更多信息答案 2 :(得分:0)
使用linq to xml你可以做这样的事情 -
XDocument doc = XDocument.Parse( xmlstring );
var methods = from methods in doc.Descendants( "s:element" )
where !methods.Attribute("name").Value.EndsWith("Resopnse")
select methods;
var methodNames = ( from method in methods
select method.Attribute( "name" ).Value ).ToList( );
var paramList = from type in methods.Descendants( "s:complexType" )
from param in type.Descendants("s:sequence")
where type.HasElements && type.Parent.Attribute("name").Value == somemethodname
select new { Name = param.Attribute( "name" ).Value };
添加对system.core和system.xml.linq的引用