【发布时间】:2026-01-23 23:55:01
【问题描述】:
我有一个 XML 编码的属性值。这实际上来自处理指令。所以原始数据看起来像这样:
<root><?pi key="value" data="<foo attr="bar">Hello world</foo>" ?></root>
我可以这样解析:
using System;
using System.Linq;
using System.Xml.Linq;
public class Program
{
private const string RawData = @"<root><?pi key=""value"" data=""<foo attr="bar">Hello world</foo>"" ?></root>";
public static void Main()
{
XDocument doc = GetXDocumentFromProcessingInstruction();
IEnumerable<XElement> fooElements = doc.Descendants("foo");
// ...
}
private static XProcessingInstruction LoadProcessingInstruction()
{
XDocument doc = XDocument.Parse(rawData);
return doc
.DescendantNodes()
.OfType<XProcessingInstruction>()
.First();
}
private static XDocument GetXDocumentFromProcessingInstruction()
{
XProcessingInstruction processingInstruction = LoadProcessingInstruction();
// QUESTION:
// Can there ever be a situation where HtmlDecode wouldn't decode the XML correctly?
string decodedXml = WebUtility.HtmlDecode(processingInstruction.Data);
// This works well, but it contains the attributes of the processing
// instruction as text.
string dummyXml = $"<dummy>{xml}</dummy>";
return XDocument.Parse(dummyXml);
}
据我所知,这绝对没问题。 但我想知道是否有一些边缘情况可能会失败,因为数据在 XML 和 HTML 中的编码方式不同。
谁有更多的见解?
编辑: 抱歉,我对 XProcessingInstruction.Data 做了一些不正确的假设,但是上面的代码仍然可以正常工作,所以我的问题是存在的。 尽管如此,我还是重写了我的代码并将所有内容包装在一个 XElement 中,这(当然)完全消除了这个问题:
private static XDocument GetXDocumentFromProcessingInstruction2()
{
XProcessingInstruction processingInstruction = LoadProcessingInstruction();
string encodedXml = string.Format("<dummy {0} />", processingInstruction.Data);
XElement element = XElement.Parse(encodedXml);
string parsedXml = element.Attribute("data").Value;
return XDocument.Parse(parsedXml);
}
所以这正是我需要的。但由于 WebUtility.HtmlDecode 运行良好,我仍然想知道是否存在第一种方法可能失败的情况。
【问题讨论】:
-
是 XML 还是 HTML?如果 XML 可以显示整个文档吗?
-
你期待什么输出?
-
您没有有效的 xml。问号无效。
-
@jdweng 这是有效的 XML。 en.wikipedia.org/wiki/Processing_Instruction
-
@TravelingFox : 没有 Root 就不能有处理指令。