在 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>

我正在尝试使用 XmlReaderXDocument 类 来识别这些情况,但我无法真正区分普通的 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;
}