需要帮助从 C# 中的 Web 服务读取 xml 响应

Posted

技术标签:

【中文标题】需要帮助从 C# 中的 Web 服务读取 xml 响应【英文标题】:Need help reading xml response from web service in c# 【发布时间】:2020-04-23 04:58:00 【问题描述】:

我正在创建一个简单的控制台应用程序来获取来自云 Web 服务的响应。我能够以 xml 格式获取响应负载,但是我发现很难读取 XML 标记并从标记中获取值。

以下是我收到的回复,

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing">
   <env:Header>
      <wsa:Action>http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService//FlowActionsService/getFlowTaskInstanceStatusResponse</wsa:Action>
      <wsa:MessageID>urn:uuid:2a2436b3-c018-4ef7-93b6-bd8b82a82041</wsa:MessageID>
   </env:Header>
   <env:Body>
      <ns0:getFlowTaskInstanceStatusResponse xmlns:ns0="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/">
         <result xmlns="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/">COMPLETED</result>
      </ns0:getFlowTaskInstanceStatusResponse>
   </env:Body>
</env:Envelope>

我正在尝试阅读带有结果标签的文本。有人可以帮我编写 C# 中的代码吗? 如果需要更多信息,请告诉我。

【问题讨论】:

在 C# 源代码中 can be converted 看起来像 Web 服务 wsdl 这能回答你的问题吗? How to make a SOAP/WSDL client in C#? 【参考方案1】:

示例 c# 类:

[XmlRoot(ElementName="Header", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public class Header 
    [XmlElement(ElementName="Action", Namespace="http://www.w3.org/2005/08/addressing")]
    public string Action  get; set; 
    [XmlElement(ElementName="MessageID", Namespace="http://www.w3.org/2005/08/addressing")]
    public string MessageID  get; set; 


[XmlRoot(ElementName="result", Namespace="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/")]
public class Result 
    [XmlAttribute(AttributeName="xmlns")]
    public string Xmlns  get; set; 
    [XmlText]
    public string Text  get; set; 


[XmlRoot(ElementName="getFlowTaskInstanceStatusResponse", Namespace="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/")]
public class GetFlowTaskInstanceStatusResponse 
    [XmlElement(ElementName="result", Namespace="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/")]
    public Result Result  get; set; 
    [XmlAttribute(AttributeName="ns0", Namespace="http://www.w3.org/2000/xmlns/")]
    public string Ns0  get; set; 


[XmlRoot(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public class Body 
    [XmlElement(ElementName="getFlowTaskInstanceStatusResponse", Namespace="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/")]
    public GetFlowTaskInstanceStatusResponse GetFlowTaskInstanceStatusResponse  get; set; 


[XmlRoot(ElementName="Envelope", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public class Envelope 
    [XmlElement(ElementName="Header", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
    public Header Header  get; set; 
    [XmlElement(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
    public Body Body  get; set; 
    [XmlAttribute(AttributeName="env", Namespace="http://www.w3.org/2000/xmlns/")]
    public string Env  get; set; 
    [XmlAttribute(AttributeName="wsa", Namespace="http://www.w3.org/2000/xmlns/")]
    public string Wsa  get; set; 

然后反序列化它:

string sampleXml;
sampleXml.DeSerializeXMLToObject<Header>();

【讨论】:

【参考方案2】:

感谢您的帮助。我在网上找到了这个解决方案,它解决了我用名称空间获取标签值的情况

XDocument xDoc = XDocument.Parse(response);
XNamespace rst = XNamespace.Get("http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/");
var rslt = xDoc.Root.Descendants(rst + "result").First();
flowStatus = rslt.Value;

【讨论】:

以上是关于需要帮助从 C# 中的 Web 服务读取 xml 响应的主要内容,如果未能解决你的问题,请参考以下文章

将 Web 服务 API 中的 XML 字符串反序列化为 C# 对象

通过 Socket c# 读取 Xml

将数据从 ios 应用程序传递到 C# Web 服务

从 C# 中的大 xml 读取子节点值

如何从 URL 读取 Windows 应用程序中的大量 xml 文件(从 Windows 应用程序到服务器的多个请求)c#

使用xpath web api c#从xml获取数据