我有一些第三方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><xxxService>
<Application>
<Status>PURCHASED</Status>
<RedirectURL>http://www.google.com?test=abc&xyz=123</RedirectURL>
</Application>
</xxxService>
</postapplication_v6result></postapplication_v6response></soap:body></soap:envelope>
答案 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><xxxService>
<Application>
<Status>PURCHASED</Status>
<RedirectURL>http://www.google.com?test=abc&xyz=123</RedirectURL>
</Application>
</xxxService>
</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无效。对于这个简单的情况,将&
替换为&
应修复它:
var xml = @"<PostApplication_V6Result>
<xxxService>
<Application>
<Status>PURCHASED</Status>
<RedirectURL>http://www.google.com?test=abc&xyz=123</RedirectURL>
</Application>
</xxxService>
</PostApplication_V6Result>";
var soap = XElement.Parse(xml);
var rawContent = HttpUtility.HtmlDecode(soap.FirstNode.ToString().Trim())
.Replace("&", "&");
var content = XElement.Parse(rawContent);
如果需要,修改代码以编码other XML special characters。