C# 将编码的XML标记转换为节点

C# 将编码的XML标记转换为节点,c#,xml,soap,C#,Xml,Soap,我通过SOAP调用获得以下XML &;书信电报;选择def&;燃气轮机&;书信电报;Id&;燃气轮机;1736及;lt/Id&;燃气轮机&;书信电报;选择name&;燃气轮机;价值清单&;lt/选择name&;燃气轮机&;书信电报;GlobalFlag&;燃气轮机;假及;lt/GlobalFlag&;燃气轮机&;书信电报;分类及;燃气轮机;一,;lt/分类及;燃气轮机&;书信电报;选择DefValues&

我通过SOAP调用获得以下XML


&;书信电报;选择def&;燃气轮机&;书信电报;Id&;燃气轮机;1736及;lt/Id&;燃气轮机&;书信电报;选择name&;燃气轮机;价值清单&;lt/选择name&;燃气轮机&;书信电报;GlobalFlag&;燃气轮机;假及;lt/GlobalFlag&;燃气轮机&;书信电报;分类及;燃气轮机;一,;lt/分类及;燃气轮机&;书信电报;选择DefValues&;燃气轮机&;书信电报;选择DefValue&;燃气轮机&;书信电报;guid&;燃气轮机;aaf6f3a7-6a74-4187-b4e7-3a9355b16796&;lt/guid&;燃气轮机&;书信电报;Id&;燃气轮机;14692及;lt/Id&;燃气轮机&;书信电报;姓名及地址;燃气轮机;公开及;lt/姓名及地址;燃气轮机&;书信电报;说明及;燃气轮机&;lt/说明及;燃气轮机&;书信电报;颜色及;燃气轮机#000000&;lt/颜色及;燃气轮机&;书信电报;DefaultFlag&;燃气轮机;假及;lt/DefaultFlag&;燃气轮机&;书信电报;SortOrder&;燃气轮机;一,;lt/SortOrder&;燃气轮机&;书信电报;选择_id&;燃气轮机;1736及;lt/选择_id&;燃气轮机&;lt/选择DefValue&;燃气轮机&;书信电报;选择DefValue&;燃气轮机&;书信电报;guid&;燃气轮机;f5082b54-d799-4fdc-80c1-0e232b360057&;lt/guid&;燃气轮机&;书信电报;Id&;燃气轮机;14693及;lt/Id&;燃气轮机&;书信电报;姓名及地址;燃气轮机;封闭式及;lt/姓名及地址;燃气轮机&;书信电报;说明及;燃气轮机&;lt/说明及;燃气轮机&;书信电报;颜色及;燃气轮机#000000&;lt/颜色及;燃气轮机&;书信电报;DefaultFlag&;燃气轮机;假及;lt/DefaultFlag&;燃气轮机&;书信电报;SortOrder&;燃气轮机;0&;lt/SortOrder&;燃气轮机&;书信电报;选择_id&;燃气轮机;1736及;lt/选择_id&;燃气轮机&;lt/选择DefValue&;燃气轮机&;书信电报;选择DefValue&;燃气轮机&;书信电报;guid&;燃气轮机;94e29e78-2ab3-463f-bbb6-ab7f36003c7f&;lt/guid&;燃气轮机&;书信电报;Id&;燃气轮机;14780及;lt/Id&;燃气轮机&;书信电报;姓名及地址;燃气轮机;逾期及;lt/姓名及地址;燃气轮机&;书信电报;说明及;燃气轮机&;lt/说明及;燃气轮机&;书信电报;颜色及;燃气轮机#000000&;lt/颜色及;燃气轮机&;书信电报;DefaultFlag&;燃气轮机;假及;lt/DefaultFlag&;燃气轮机&;书信电报;SortOrder&;燃气轮机;二,;lt/SortOrder&;燃气轮机&;书信电报;选择_id&;燃气轮机;1736及;lt/选择_id&;燃气轮机&;lt/选择DefValue&;燃气轮机&;lt/选择DefValues&;燃气轮机&;lt/选择def&;燃气轮机;

有没有办法将GetValueForFieldResult节点中的数据转换为实际的XML,这样我就可以解析数据了

下面是我如何进行SOAP调用和存储XML。我正在学习C#,如果下面是一团乱麻,我会用我的方法

HttpWebRequest reqVl=(HttpWebRequest)WebRequest.Create(serverURL+“/ws/Field.asmx”);
请求标题添加(“SOAPAction”http://URL/webservices/GetValueListForField");
reqVl.ContentType=“text/xml;字符集=\”utf-8\”;
requvl.Accept=“text/xml”;
需求方法=“POST”;
使用(Stream stm=reqVl.GetRequestStream())
{
使用(StreamWriter stmw=新StreamWriter(stm))
{
stmw.Write(VLsoap);
}
}
WebResponse responseVL=reqVl.GetResponse();
Stream responseStreamVL=responseVL.GetResponseStream();
XmlReader rdrVL=XmlReader.Create(responseStreamVL);
XmlDocument vls=新的XmlDocument();
vls.荷载(rdrVL);

以下是一些实现您所需的代码-但是,请在阅读后阅读本文,了解为什么这可能不是实现您所需的最佳方法

测试为使用您的邮件和.Net 4

假设vls以XML形式包含SOAP消息,我们将问题分成两半;解析soap消息,并将
GetValueListForFieldResult
节点的内容提取并解码为一个字符串,该字符串可以加载到另一个
XmlDocument

第一部分-获取
GetValueListForFieldResult
节点的内容

  XmlNamespaceManager namespaceManager = new XmlNamespaceManager(vls.NameTable);
  namespaceManager.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
  namespaceManager.AddNamespace("default", "http://URLHere/webservices/");

  XmlNode payLoadNode =
    vls.SelectSingleNode("/soap:Envelope/soap:Body/default:GetValueListForFieldResponse/default:GetValueListForFieldResult", namespaceManager);

  string encodedXml = payLoadNode.InnerText;
第二部分-将编码字符串获取到Xml文档中

正是在这一点上,我们得到了编码字符串。我们有几个选择来解码这个HTML;在使用.Net 4时,我选择了最简单的:

  string decodedXml = WebUtility.HtmlDecode(encodedXml);

  XmlDocument payloadDocument = new XmlDocument();
  payloadDocument.LoadXml(decodedXml);

如果你使用.NET 3.5,那么你必须考虑添加一个对Stray.Web的引用,并使用<代码> HTTPosial.HtmlDecode < /Cord>代替对字符串进行解码。 分析上面的消息会得到以下结果:

<SelectDef>
  <Id>1736</Id>
  <SelectName>Values List</SelectName>
  <GlobalFlag>False</GlobalFlag>
  <Sort>1</Sort>
  <SelectDefValues>
    <SelectDefValue>
      <guid>aaf6f3a7-6a74-4187-b4e7-3a9355b16796</guid>
      <Id>14692</Id>
      <Name>Open</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>1</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
    <SelectDefValue>
      <guid>f5082b54-d799-4fdc-80c1-0e232b360057</guid>
      <Id>14693</Id>
      <Name>Closed</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>0</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
    <SelectDefValue>
      <guid>94e29e78-2ab3-463f-bbb6-ab7f36003c7f</guid>
      <Id>14780</Id>
      <Name>Past Due</Name>
      <Description></Description>
      <Color>#000000</Color>
      <DefaultFlag>False</DefaultFlag>
      <SortOrder>2</SortOrder>
      <select_id>1736</select_id>
    </SelectDefValue>
  </SelectDefValues>
</SelectDef>

1736
值列表
假的
1.
aaf6f3a7-6a74-4187-b4e7-3a9355b16796
14692
打开
#000000
假的
1.
1736
f5082b54-d799-4fdc-80c1-0e232b360057
14693
关闭
#000000
假的
0
1736
94e29e78-2ab3-463f-bbb6-ab7f36003c7f
14780
逾期
#000000
假的
2.
1736
替代方案

您可能不希望这样做的原因是,您收到的响应已使用SOAP包装;因此,您可能希望尝试将连接到的服务作为web服务使用,并生成代理库;这将把您上面看到的所有代码以及您编写的代码封装在一个代理中,该代理允许您以更安全、更不脆弱的方式检索所需的值。Net中内置了对此的支持

此外,由于您要连接的URL在ASMX中终止,它告诉您这很可能是一个本机.Net web服务,因此将您的客户端连接到它应该很简单


MSDN主题“”应该可以帮助您生成代理并避免上面的所有代码。

谢谢dash,您的代码工作得非常出色。我会使用引用,但我需要保持所有代码内联;没有代码隐藏。