如何从web服务中读取XML并在C#中查询行集属性
本文关键字:查询 属性 并在 读取 web 服务 XML | 更新日期: 2023-09-27 18:28:14
这是我从web服务接收的示例XML。
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
<s:AttributeType name='NAME' rs:number='1'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='25'
rs:maybenull='false'/>
</s:AttributeType>
<s:AttributeType name='DESCRIPTION' rs:number='2' rs:nullable='true'
rs:writeunknown='true'>
<s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='80'/>
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row NAME='JOE BLOW' DESCRIPTION='PROGRAMMER'/>
<z:row NAME='ANN SMITH' DESCRIPTION='FRONT DESK'/>
<z:row NAME='STEVE JOHNSON' DESCRIPTION='TESTER'/>
</rs:data>
</xml>
我不知道如何到达<rs:data>
节点。我最终想枚举每个<z:row>
,并得到属性NAME
和DESCRPTION
。Web服务将其作为字符串返回给我,因此我将该字符串加载到XMLDocument中,如下所示:
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xmlString);
现在,我不确定是否需要使用XmlNamespaceManager
来通知我的xDoc
导入<s:Schema>
由于前缀rs.,我尝试选择一个带有XPath的节点,但没有成功
XmlNode xNode = xDoc.SelectSingleNode("/rs:data");
如果需要任何进一步的信息,请询问。
如果您将xml作为字符串,请尝试像这样解析它,而不是使用Load()
var xml = XDocument.Parse(xmlstring);
您必须使用名称空间才能正确地获取数据。
XNamespace ns = "#RowsetSchema";
foreach (var element in xml.Descendants().Elements(ns + "row"))
{
Console.WriteLine ("Name = " + element.Attribute("NAME").Value + ", " + "Description = " + element.Attribute("DESCRIPTION").Value);
}
使用带有linq的xml可以这样做:
XDocument xmlDoc = new XDocument();
xmlDoc = XDocument.Parse(xml);
XNamespace ns = "#RowsetSchema";
var namesDescs = from namesDesc in xmlDoc.Descendants().Elements(ns + "row")
select new
{
name = namesDesc.Attribute("NAME").Value,
description = namesDesc.Attribute("DESCRIPTION").Value,
};
以下是一些使用以下扩展处理xml的类:http://searisen.com/xmllib/extensions.wiki
public class Test
{
XElement self;
public Test(XElement self)
{
this.self = self;
}
public RSDataRow[] DataRows
{
get
{
if (null == _DataRows)
{
_DataRows = self.GetEnumerable("rs:data/z:row", xrow => new RSDataRow(xrow)).ToArray();
}
return _DataRows;
}
}
RSDataRow[] _DataRows;
}
[DebuggerDisplay("{Name}")]
public class RSDataRow
{
XElement self;
public RSDataRow(XElement self)
{
this.self = self;
}
public string Name
{
get { return self.Get("NAME", string.Empty); }
}
public string Description
{
get { return self.Get("DESCRIPTION", string.Empty); }
}
}
你使用它就像:
Test test = new Test(XElement.Parse(xmlstring));
foreach (RSDataRow row in test.DataRows)
{
string name = row.Name;
string desc = row.Description;
}