来自 Web 服务消费的 DataSet XML 响应

Posted

技术标签:

【中文标题】来自 Web 服务消费的 DataSet XML 响应【英文标题】:DataSet XML Response from Web Service consumption 【发布时间】:2016-02-18 21:07:22 【问题描述】:

以下是我尝试使用的有效且更新的 XML:

<DataSet xmlns="http://tempuri.org/">
    <xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">
    <xs:element name="response">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="user" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:attribute name="id" type="xs:string"/>
    </xs:complexType>
    </xs:element>
    <xs:element name="status" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:attribute name="code" type="xs:string"/>
    <xs:attribute name="value" type="xs:string"/>
    <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
    </xs:element>
    <xs:element name="error" minOccurs="0" maxOccurs="unbounded">
    <xs:complexType>
    <xs:attribute name="code" type="xs:string"/>
    <xs:attribute name="message" type="xs:string"/>
    </xs:complexType>
    </xs:element>
    </xs:sequence>
    <xs:attribute name="operation" type="xs:string"/>
    <xs:attribute name="timestamp" type="xs:string"/>
    </xs:complexType>
    </xs:element>
    <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element ref="response"/>
    </xs:choice>
    </xs:complexType>
    </xs:element>
    </xs:schema>
    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
    <NewDataSet xmlns="">
    <response diffgr:id="response1" msdata:rowOrder="0" diffgr:hasChanges="inserted" operation="AUTHENTICATION" timestamp="2015-11-19 18:21:17.457" msdata:hiddenresponse_Id="0">
    <user diffgr:id="user1" msdata:rowOrder="0" diffgr:hasChanges="inserted" id="blumaesnetwork" msdata:hiddenresponse_Id="0"/>
    <status diffgr:id="status1" msdata:rowOrder="0" diffgr:hasChanges="inserted" code="315" value="FAILED" description="Authentication Failed. User ID Not Found" msdata:hiddenresponse_Id="0"/>
    <error diffgr:id="error1" msdata:rowOrder="0" diffgr:hasChanges="inserted" code="-1" message="User Not Found" msdata:hiddenresponse_Id="0"/>
    </response>
    </NewDataSet>
    </diffgr:diffgram>
    </DataSet>

使用下面的 C# 代码:

x.LoadXml(_xmlString);

XDocument x1 = new XDocument();
x1 = XDocument.Parse(_xmlString);

IEnumerable<responseStatus> ListRsts = (from e in x1.Descendants("responseStatus")
                                        select new responseStatus
                                        
                                           code = e.Element("code").Value,
                                           value = e.Element("value").Value,
                                           description = e.Element("description").Value
                                        );
foreach (var br in ListRsts)
         codeField = (br.code);

它一直抛出我错过“diffgr”的错误。

【问题讨论】:

“我错过了 'diffgr'” 听起来不像我从 .NET 中看到的任何错误。 实际错误是什么? 您的 XML 不包含 diffgrmsdata 的命名空间。您的 XML 中应该有一个包含这些命名空间的根节点。 实际错误:System.Xml.dll 中出现“System.Xml.XmlException”类型的异常,但未在用户代码中处理附加信息:“diffgr”是未声明的前缀。第 1 行,位置 49。 @RahulSingh 你能帮我看看我该怎么做吗..也许修改我的代码? 是的,你非常正确@dbc XML 有很多错误。谢谢大家真的很感激 【参考方案1】:

作为响应 XML,您得到的是已保存的 DataSet。与其尝试破译diffgram,不如让您更好地利用该类型的ReadXml 方法。它完全具备读取 xml 的能力,并为您提供表格和 Relationships 上的指定行为。

var ds = new DataSet();
ds.ReadXml(File.Open(@"C:\temp\ds.xml", FileMode.Open));

var listOfStatus = from row in ds.Tables["response"].Rows.Cast<DataRow>()
       from status in row.GetChildRows("response_status")
       select new  code = status["code"], 
                    value = status["value"], 
                    description = status["description"] ;

foreach(var stat in listOfStatus)

    // do what ever you need to do with the Status record(s)

在上面的代码中,我读取了表响应中的行,然后获取表状态的子行。对于每个状态行,都会使用您似乎感兴趣的三个字段创建一个匿名类型。您可以通过迭代该匿名类型的 IEnumerable 来处理这些字段。

【讨论】:

以上是关于来自 Web 服务消费的 DataSet XML 响应的主要内容,如果未能解决你的问题,请参考以下文章

.NET XML Web 服务,消费类无法访问 Web 服务类

PHP如何消费SOAP web服务?

跨 WCF Web 服务请求序列化通用 XML 数据

为啥来自 xml Web 服务的字符串在 Android TextView 中不显示新行?

如何使用来自iPhone应用程序的SOAP请求将图像+ xml上传到Web服务器

LINQ to DataSet