我正在编写一些代码来读取包含 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:
如果你想拥有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 只包含声明,也许您可以添加一个空根?例如:
var fragmentResult = GetXmlEncoding(xmlFragment + "<root/>");
关于c# - 从 XML 声明片段 : XmlDeclaration is not supported for partial content parsing 获取 XML 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34293196/