在 xml 结构中获取伪 xml

Get pseudo xml inside xml structure

我有一些第三方 xml,我正在尝试解析。

这个问题与 this one 相似,因为我正在寻找隐藏在其中一个元素中的伪 xml 代码。然而,我需要的结果是不同的。

这是return编辑的xml:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <PostApplication_V6Response xmlns="http://xxxService.org/">
          <PostApplication_V6Result>string</PostApplication_V6Result>
        </PostApplication_V6Response>
      </soap:Body>
    </soap:Envelope>

我正在使用 Linq XML - 我可以 return 元素 <PostApplication_V6Result> - 这是我可以检索的树中最低的元素。

使用此代码:

    var name = "{http://xxxService.org/}PostApplication_V6Result";

    var soap = XDocument.Parse(result)
        .Descendants(name)
        .First();

但是,该元素中包含的值是某种伪 xml - 不是 xml,而是 xml 相似。

这是里面的内容:

<xxxService>
    <Application>
        <Status>Accepted</Status>
        <RedirectUrl>http://www.google.com?abc=123</RedirectUrl>
        <Value>100</Value>
    </Application>
</xxxService>

我已经尝试了几乎所有方法来获取数据,但我得到了一个无效的 char '=' 错误或一个 data at root 无效消息。

理想情况下,我想让 "Application" 节点中的数据进入一种状态,我可以通过像下面这样的通用解析器 运行 它,但是如果我必须手动执行某些操作我会。这几天我一直在努力解决这个问题。

public static T Deserialise<T>(this XElement element)
{
    var serializer = new XmlSerializer(typeof(T));

    using (var reader = element.CreateReader())
    {
        return (T)serializer.Deserialize(reader);
    }
}

感谢任何帮助。

更新

这是完整的 xml,即 returned- 正如您所看到的,内部部分实际上是 html 而不是 xml。

<soap:body><postapplication_v6response xmlns="http://xxxService.org/"><postapplication_v6result>&lt;xxxService&gt;
&lt;Application&gt;
&lt;Status&gt;PURCHASED&lt;/Status&gt;
&lt;RedirectURL&gt;http://www.google.com?test=abc&amp;xyz=123&lt;/RedirectURL&gt;
&lt;/Application&gt;
&lt;/xxxService&gt;
</postapplication_v6result></postapplication_v6response></soap:body></soap:envelope>

这是一个例子。 (我已经删除了名称空间):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Xml.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject2
{
    [TestClass]
    public class Class7
    {
        [TestMethod]
        public void xmltest()
        { 
            string xml = @"<body><postapplication_v6response><postapplication_v6result>&lt;xxxService&gt;
&lt;Application&gt;
&lt;Status&gt;PURCHASED&lt;/Status&gt;
&lt;RedirectURL&gt;http://www.google.com?test=abc&amp;xyz=123&lt;/RedirectURL&gt;
&lt;/Application&gt;
&lt;/xxxService&gt;
</postapplication_v6result></postapplication_v6response></body>";

            XDocument doc = XDocument.Parse(xml);
            string encodedhtml = doc.Descendants("postapplication_v6result")
                    .First().Value;

            string decodedhtml = HttpUtility.HtmlDecode(encodedhtml);

            Console.WriteLine(decodedhtml);
        }
    }
}

解码整个字符串的副作用是,一些需要保持编码的 XML 特殊字符(在本例中为 & char),它们被解码导致无效 XML。对于这个简单的案例,将 & 替换为 &amp; 应该可以解决问题:

var xml = @"<PostApplication_V6Result>
&lt;xxxService&gt;
&lt;Application&gt;
&lt;Status&gt;PURCHASED&lt;/Status&gt;
&lt;RedirectURL&gt;http://www.google.com?test=abc&amp;xyz=123&lt;/RedirectURL&gt;
&lt;/Application&gt;
&lt;/xxxService&gt;
</PostApplication_V6Result>";
var soap = XElement.Parse(xml);

var rawContent = HttpUtility.HtmlDecode(soap.FirstNode.ToString().Trim())
                            .Replace("&", "&amp;");
var content = XElement.Parse(rawContent);

如果需要,修改代码以编码 other XML special characters