在xml结构中获取伪xml

时间:2015-04-21 08:15:15

标签: c# xml linq linq-to-xml

我有一些第三方xml,我试图解析。

这个问题类似于this one,因为我希望得到隐藏在其中一个元素中的伪xml代码。但是,我需要的结果是不同的。

以下是返回的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 to XML - 我可以返回元素<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>

我已经尝试了所有可以获取数据的所有内容,但是我得到了一个无效的字符&#39; =&#39;错误或根无效消息中的数据。

理想情况下,我希望获得包含在&#34;应用程序&#34;节点进入一个状态,我可以通过下面的通用解析器运行它,但如果我必须手动做一些事情我会。我已经尝试解决这个问题几天了。

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返回 - 你可以看到内部部分实际上是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>

2 个答案:

答案 0 :(得分:1)

这是一个例子。 (我已经取出名称空间):

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);
        }
    }
}

答案 1 :(得分:0)

解码整个字符串的副作用是,需要保持编码的某些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