从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

2023-11-27

我正在编写一些代码来读取包含 XML 声明的 XML 片段,例如<?xml version="1.0" encoding="utf-8"?>并解析编码。从MSDN,我应该能够这样做:

var nt = new NameTable();
var mgr = new XmlNamespaceManager(nt);
var context = new XmlParserContext(null, mgr, null, XmlSpace.None);

var reader = new System.Xml.XmlTextReader(@"<?xml version=""1.0"" encoding=""UTF-8""?>", 
    System.Xml.XmlNodeType.XmlDeclaration, context);

但是,我得到了System.Xml.XmlException致电System.Xml.XmlTextReader带有错误消息的构造函数:

部分内容不支持 XmlNodeType XmlDeclaration 解析。

我用谷歌搜索了引号中的这个错误——恰好找到了零个结果(编辑:现在只有一个结果:这篇文章)——而且没有引号,这不会产生任何有用的结果。我也看过XmlNodeType 的 MSDN,并且它没有说任何关于它不受支持的信息。

我在这里缺少什么?我怎样才能获得XmlTextReader来自 XML 声明片段的实例?

Note, 我的目标只是确定部分构建的 XML 文档的编码我假设它至少包含一个声明节点;因此,我想得到reader.Encoding。如果有其他方法可以做到这一点,我对此持开放态度。

目前,我正在使用正则表达式手动解析声明,这不是最好的方法。


更新:从 XML 文档或 XML 片段获取编码:

这是一种无需求助于假根即可获取编码的方法,使用XmlReader.Create.

private static string GetXmlEncoding(string xmlString)
{
    if (string.IsNullOrWhiteSpace(xmlString)) throw new ArgumentException("The provided string value is null or empty.");

    using (var stringReader = new StringReader(xmlString))
    {
        var settings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };

        using (var xmlReader = XmlReader.Create(stringReader, settings))
        {
            if (!xmlReader.Read()) throw new ArgumentException(
                "The provided XML string does not contain enough data to be valid XML (see https://msdn.microsoft.com/en-us/library/system.xml.xmlreader.read)");

            var result = xmlReader.GetAttribute("encoding");
            return result;
        }
    }
}

下面是输出,包含完整的 XML 和片段 XML:

XML encoding ith XmlReader.Create

如果你想要System.Text.Encoding,你可以修改代码如下:

    private static Encoding GetXmlEncoding(string xmlString)
    {
        using (StringReader stringReader = new StringReader(xmlString))
        {
            var settings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };

            var reader = XmlReader.Create(stringReader, settings);
            reader.Read();

            var encoding = reader.GetAttribute("encoding");

            var result = Encoding.GetEncoding(encoding);
            return result;
        }
    }

旧答案:

正如你提到的,XmlTextReader的编码-property 包含编码。

这是完整的控制台应用程序的源代码,希望有用:

class Program
{
    static void Main(string[] args)
    {
        var asciiXML = @"<?xml version=""1.0"" encoding=""ASCII""?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>";
        var utf8XML = @"<?xml version=""1.0"" encoding=""UTF-8""?><note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>";

        var asciiResult = GetXmlEncoding(asciiXML);
        var utfResult = GetXmlEncoding(utf8XML);

        Console.WriteLine(asciiResult);
        Console.WriteLine(utfResult);

        Console.ReadLine();
    }
    private static Encoding GetXmlEncoding(string s)
    {
        var stream = new MemoryStream(Encoding.UTF8.GetBytes(s));

        using (var xmlreader = new XmlTextReader(stream))
        {
            xmlreader.MoveToContent();
            var encoding = xmlreader.Encoding;

            return encoding;
        }
    }
}

这是程序的输出:

XML Encoding output

如果您知道 XML 仅包含声明,也许您可​​以添加一个空根?例如:

        var fragmentResult = GetXmlEncoding(xmlFragment + "<root/>");

XML Fragment

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration 的相关文章

随机推荐