在 C# 中检测 XML 个片段
Detect XML fragments in C#
在 C#/.NET 中是否有可靠的方法来检测给定的 XML 片段是根 XML 内容还是非根片段?
根内容:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>a</a>
</root>
片段:
<a>a</a>
<b>b</b>
<c>c</c>
我正在尝试使用 XmlReader
和 XDocument
类 来识别这些情况,但我无法真正区分普通的 XmlException
和抛出的尝试加载其他有效片段时。
public static class XmlString
{
public static bool IsFragment(string xml)
{
try
{
XElement.Parse(xml);
return false;
}
catch
{
XElement.Parse("<root>" + xml + "</root>");
return true;
}
}
}
为什么不是像这样简单的东西:
尝试解析它。如果它引发异常,则将其封装并尝试再次解析它。如果它确实解析了,那么它就是通过封装在根标记中而变得有效的片段集合。
如果你想使用XmlReader,你可以这样做:
static bool IsXmlRooted(Stream st) {
bool sawRoot = false;
using (var reader = XmlReader.Create(st, new XmlReaderSettings() {
// fragment works for documents too
ConformanceLevel = ConformanceLevel.Fragment
})) {
while (reader.Read()) {
// if we see element at depth 0 - it's top-level element
if (reader.NodeType == XmlNodeType.Element && reader.Depth == 0) {
// if we already saw another top level element - that is fragment
// can return fast
if (sawRoot)
return false;
sawRoot = true;
}
}
}
return true;
}
在 C#/.NET 中是否有可靠的方法来检测给定的 XML 片段是根 XML 内容还是非根片段?
根内容:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>a</a>
</root>
片段:
<a>a</a>
<b>b</b>
<c>c</c>
我正在尝试使用 XmlReader
和 XDocument
类 来识别这些情况,但我无法真正区分普通的 XmlException
和抛出的尝试加载其他有效片段时。
public static class XmlString
{
public static bool IsFragment(string xml)
{
try
{
XElement.Parse(xml);
return false;
}
catch
{
XElement.Parse("<root>" + xml + "</root>");
return true;
}
}
}
为什么不是像这样简单的东西:
尝试解析它。如果它引发异常,则将其封装并尝试再次解析它。如果它确实解析了,那么它就是通过封装在根标记中而变得有效的片段集合。
如果你想使用XmlReader,你可以这样做:
static bool IsXmlRooted(Stream st) {
bool sawRoot = false;
using (var reader = XmlReader.Create(st, new XmlReaderSettings() {
// fragment works for documents too
ConformanceLevel = ConformanceLevel.Fragment
})) {
while (reader.Read()) {
// if we see element at depth 0 - it's top-level element
if (reader.NodeType == XmlNodeType.Element && reader.Depth == 0) {
// if we already saw another top level element - that is fragment
// can return fast
if (sawRoot)
return false;
sawRoot = true;
}
}
}
return true;
}