【问题标题】:Check if a line of XML is valid (not a full document)检查一行 XML 是否有效(不是完整的文档)
【发布时间】:2013-02-12 17:59:33
【问题描述】:

在 C# 中:

我有一组文本行(应该是 XML),它们被发送到要添加到 XML 文档中的函数。每一行都是一个简单的块,如以下 3 个示例:

<AAA f="1" g="3"> </AAA>
<AAA f="2" g="2"> </AAA>
<AAA f="3" g="3"> </AA     <-- Oops a bad one!

我需要检查每一行以查看它是否是有效的 XML,然后才能将其接受为完整的 XML 文档,因为有些行是坏的,但我们想要所有好的。

ROW1: good
ROW2: good
ROW3: bad
ROW4: good

在这种情况下,我们只需要 ROW1,2 和 4。

那么,当行字符串不是完整文档时,如何检查行字符串是否是有效的 XML?

【问题讨论】:

  • 把它打包成一个文档?
  • 如何读取 XDocument 或 XmlDocument 中的整个 xml 并显示来自异常的行号?您也可以将其应用于单行,但这会很慢
  • 您给出的所有“有效”示例都将作为完整文档有效,因此您可以将它们解析为完整文档。你能举一个不适用的例子吗?
  • stackoverflow.com/questions/86292/…stackoverflow.com/questions/1026247/…中有建议;实际上,他们都同意 - 您必须尝试将 sn-p 加载到文档中并捕获无效 XML sn-ps 的结果异常。

标签: c# xml validation parsing


【解决方案1】:

我会尝试这样的:

public static bool IsValid(this string XML)
{
    try
    {
        XElement temp = XElement.Parse(XML);
    }
    catch (FormatException)
    {
        return false;
    }
    catch (XmlException)
    {
        return false;
    }
    return true;
}

【讨论】:

    【解决方案2】:

    您可以使用 XmlTextReader 验证 XML 文档片段(这就是您的行),但您必须使用特殊的阅读器设置创建阅读器

    
    XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
    XmlReaderSettings settings = new XmlReaderSettings() {
        ConformanceLevel = ConformanceLevel.Fragment
    };
    XmlReader reader = XmlReader.Create(new StringReader(xmlFrag), settings, context);
    

    XmlReaderSettings ConformanceLevel

    【讨论】:

    • @John Saunders 不,构造函数没有被弃用,没有 ObsoleteAttribute。文档只是说推荐的方法是使用具有适当 XmlReaderSettings 的静态 XmlReader.Create 方法...但同意:该工厂方法具有更多功能。
    【解决方案3】:

    我会这样做的。

    private static bool IsValidXml(string xmlToCheck)
            {
                var doc = new XmlDocument();
                try
                {
                    doc.LoadXml(xmlToCheck);
                    return true;
                }
                catch (Exception ex)
                {
                    //catch ex.
                    return false;
                }
            }
    

    【讨论】:

    • 问题中提到的那些行不是 XmlDocuments,所以这不是正确的方法。
    • 另外,-1 用于捕获 Exception 而不是特定异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2015-04-24
    • 2018-07-15
    • 2011-11-08
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多