gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:54:21 26 4
gpt4 key购买 nike

我正在编写一些代码来读取包含 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com