代码之家  ›  专栏  ›  技术社区  ›  si618

如何判断字符串是否为xml?

  •  13
  • si618  · 技术社区  · 16 年前

    我们有一个字符串字段,可以包含XML或纯文本。XML不包含 <?xml

    string redact(string eventDetail)
    {
        string detail = eventDetail.Trim();
        if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
        ...
    

    XmlDocument.LoadXml XmlException

    <TableName FirstField="Foo" SecondField="Bar" /> 
    <TableName FirstField="Foo" SecondField="Bar" /> 
    ...
    

    string redact(string eventDetail)
    {
        if (string.IsNullOrEmpty(eventDetail)) return eventDetail; //+1 for unit tests :)
        string detail = eventDetail.Trim();
        if (!detail.StartsWith("<") && !detail.EndsWith(">")) return eventDetail;
        XmlDocument xml = new XmlDocument();
        try
        {
            xml.LoadXml(string.Format("<Root>{0}</Root>", detail));
        }
        catch (XmlException e)
        {
            log.WarnFormat("Data NOT redacted. Caught {0} loading eventDetail {1}", e.Message, eventDetail);
            return eventDetail;
        }
        ... // redact
    
    7 回复  |  直到 16 年前
        1
  •  8
  •   lod3n    16 年前

        2
  •  4
  •   Samuel Carrijo    16 年前

    一种可能是将这两种解决方案混合使用。您可以使用redact方法并尝试加载它(在if中)。这样,您将只尝试加载可能是格式良好的xml,并丢弃大多数非xml条目。

        3
  •  2
  •   JaredPar    16 年前

    如果你的目标是可靠性,那么最好的选择是使用XmlDocument。LoadXml以确定它是否是有效的XML。对数据的完整解析可能很昂贵,但这是可靠地判断它是否是有效XML的唯一方法。否则,缓冲区中未检查的任何字符都可能导致数据为非法XML。

        4
  •  1
  •   Ira Baxter    16 年前

    这取决于你想要的测试有多准确。考虑到你已经没有官方<xml,您已经在尝试检测非xml的东西。理想情况下,您应该使用完整的XML解析器来解析文本(正如您建议的LoadXML);它拒绝的任何东西都不是XML。问题是,您是否关心是否接受非XML字符串?例如,

      <the quick brown fox jumped over the lazy dog's back>
    

    作为XML并剥离它?如果是这样,你的技术很好。如果没有,你必须决定你想要的测试有多严格,并用这种严格程度对识别器进行编码。

        5
  •  1
  •   Noon Silk    16 年前

    如果没有这样一个可爱的解决方案,我认为你所拥有的是好的(用于验证它以这些角色开始和结束)。

        6
  •  0
  •   Pavel Minaev    16 年前

    如果XML不包含根元素(即它是一个XML片段,而不是一个完整的文档),那么以下示例也是完全有效的,但与您的检测器不匹配:

    foo<bar/>baz
    

    事实上,任何文本字符串都是有效的XML片段(考虑一下,如果原始XML文档只是包裹一些文本的根元素,而你拿走了根元素标签)!

        7
  •  0
  •   Evgeny    16 年前
    try
    {
        XmlDocument myDoc = new XmlDocument();
        myDoc.LoadXml(myString);
    }
    catch(XmlException ex)
    {
        //take care of the exception
    }