【问题标题】:Can I use WebUtility.HtmlDecode to decode XML?我可以使用 WebUtility.HtmlDecode 解码 XML 吗?
【发布时间】:2026-01-23 23:55:01
【问题描述】:

我有一个 XML 编码的属性值。这实际上来自处理指令。所以原始数据看起来像这样:

<root><?pi key="value" data="&lt;foo attr=&quot;bar&quot;&gt;Hello world&lt;/foo&gt;" ?></root>

我可以这样解析:

using System;
using System.Linq;
using System.Xml.Linq;
                
public class Program
{
    private const string RawData = @"<root><?pi key=""value"" data=""&lt;foo attr=&quot;bar&quot;&gt;Hello world&lt;/foo&gt;"" ?></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 就不能有处理指令。

标签: c# .net xml


【解决方案1】:

删除问号并在输入末尾添加正斜杠我明白了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "<pi data=\"&lt;foo attr=&quot;bar&quot;&gt;Hello world&lt;/foo&gt;\" />";
            XElement pi = XElement.Parse(input);
            string data = (string)pi.Attribute("data");
            XElement foo = XElement.Parse(data);
            string attr = (string)foo.Attribute("attr");
            string innertext = (string)foo;
        }
    }
}

【讨论】:

  • 很抱歉意外投了反对票,您可以编辑您的回复,我会收回反对票。这实际上很有帮助。