在 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><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>
这是一个例子。 (我已经删除了名称空间):
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);
}
}
}
解码整个字符串的副作用是,一些需要保持编码的 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。
我有一些第三方 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><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>
这是一个例子。 (我已经删除了名称空间):
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);
}
}
}
解码整个字符串的副作用是,一些需要保持编码的 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。