如何从web服务中读取XML并在C#中查询行集属性?

如何从web服务中读取XML并在C#中查询行集属性?,c#,xml,web-services,xsd,C#,Xml,Web Services,Xsd,下面是我从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:Eleme

下面是我从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>
现在,我不确定是否需要使用
XmlNamespaceManager
来通知我的
xDoc
导入

我尝试选择一个带有XPath的节点,但由于前缀rs,所以运气不佳

XmlNode xNode = xDoc.SelectSingleNode("/rs:data");

如果需要进一步的信息,请询问。

如果您将xml作为字符串,请尝试像解析一样解析它,而不是使用Load()

您必须使用名称空间来正确地获取数据

XNamespace ns = "#RowsetSchema";

foreach (var element in xml.Descendants().Elements(ns + "row"))
{
    Console.WriteLine ("Name = " + element.Attribute("NAME").Value + ", " + "Description = " + element.Attribute("DESCRIPTION").Value); 
}

如果您将xml作为字符串,请尝试像解析一样解析它,而不是使用Load()

您必须使用名称空间来正确地获取数据

XNamespace ns = "#RowsetSchema";

foreach (var element in xml.Descendants().Elements(ns + "row"))
{
    Console.WriteLine ("Name = " + element.Attribute("NAME").Value + ", " + "Description = " + element.Attribute("DESCRIPTION").Value); 
}

下面是一些使用以下扩展处理xml的类:

您使用它的方式如下:

Test test = new Test(XElement.Parse(xmlstring));
foreach (RSDataRow row in test.DataRows)
{
    string name = row.Name;
    string desc = row.Description;
}

下面是一些使用以下扩展处理xml的类:

您使用它的方式如下:

Test test = new Test(XElement.Parse(xmlstring));
foreach (RSDataRow row in test.DataRows)
{
    string name = row.Name;
    string desc = row.Description;
}

将xml与linq结合使用,可以这样做:

XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xmlString);
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与linq结合使用,可以这样做:

XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xmlString);
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,
    };

仅供参考,语言是“C#”,不是“C夏普”。仅供参考,语言是“C#”,不是“C夏普”.几乎是Flowerking的全部副本post@ChuckSavage当前位置我意识到了这一点,但我只是想展示一个使用linq的解决方案,所以从这个意义上说,它略有不同,但我投票支持了他的答案,并对其进行了更正。几乎完全复制了Flowerking的答案post@ChuckSavage:我意识到了这一点,但我只是想展示一个使用linq的解决方案,所以从这个意义上讲,它有点我不同意,但我对他的答案投了赞成票并改正了。