【问题标题】:Detect XML fragments in C#在 C# 中检测 XML 片段
【发布时间】:2017-03-09 12:09:26
【问题描述】:

在 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 类来识别这些情况,但我无法真正区分普通的 XmlExceptions 和尝试加载其他有效片段时抛出的情况。

【问题讨论】:

  • 正则表达式可以帮助你。 Using Regex to match xml tags
  • 您将如何处理这些信息?
  • @Evk 在此基础上,我将决定是否可以使用XmlDocument.Load() 加载它,如果它是根,或者使用XmlDocument.CreateDocumentFragment(),如果它是一个片段。我不知道如何对 Linq-to-XML 类(例如 XDocument)做同样的事情。

标签: c# .net xml linq-to-xml xmlreader


【解决方案1】:

如果你想使用 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;
}

【讨论】:

  • 这与我一直在寻找的非常接近。我喜欢您不必总是在确定它是否已植根之前检查整个 XML,也不必将其全部加载到内存中。
【解决方案2】:
public static class XmlString
{
    public static bool IsFragment(string xml)
    {
        try
        {
            XElement.Parse(xml);
            return false;
        }
        catch
        {
            XElement.Parse("<root>" + xml + "</root>");
            return true;
        }
    }
}

为什么不这么简单:

尝试解析它。如果它引发异常,请将其封装并尝试再次解析它。如果它解析,它是通过封装在根标签中而有效的片段集合。

【讨论】:

  • 这实际上非常简单。我看到的唯一不便之处是,当您从文件或其他流中获取 XML 时,它不是很友好。我希望我可以使用 XmlReader 做到这一点,并避免读取内存中的整个 XML(进入 string)。
猜你喜欢
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多