c# - 从 XML 声明片段 : XmlDeclaration is not supported for partial content parsing 获取 XML 编码

标签 c# .net xml parsing encoding

我正在编写一些代码来读取包含 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 is not supported for partial content parsing.

我用引号搜索了这个错误——找到的结果恰好为零(编辑:现在有一个结果:这篇文章)——而且没有引号,没有任何用处。我也看过 MSDN for the XmlNodeType ,它没有说明它不受支持。

我在这里错过了什么? 我怎样才能得到 XmlTextReader来自 XML 声明片段的实例

请注意,我的目标只是确定部分构建的 XML 文档的编码,我假设它至少包含一个声明节点;因此,我试图获得 reader.Encoding .如果有其他方法可以做到这一点,我愿意接受。

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

最佳答案

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

这里有一种无需求助于假 root 即可获得编码的方法,使用 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 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's Encoding -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

关于c# - 从 XML 声明片段 : XmlDeclaration is not supported for partial content parsing 获取 XML 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34293196/

相关文章:

.net - 从 Microsoft.Web.Administration 和相对于其根的路径查找物理路径

java - JBOSS 在读取大型 XML 时重新启动

xml - Spring Security XML 错误 - cvc-complex-type.2.4.a : Invalid content was found starting with element 'csrf'

c# - 使用反射创建通用 List<T>

c# - 一类全局变量

c# - Win XP(x86) OS 但不是 Win 7(x64) 上的二级属性绑定(bind)异常

c# - 通过设置为空来处理?

java - 如何在通过 DocumentBuidlerFactory 创建新的 xml 文件时生成 ParserConfigurationException

c# - SignalR 连接不会启动到 IIS 托管的应用程序

c# - Python .NET、多线程和 Windows 事件循环