验证xml的有效方法?

时间:2012-01-16 21:23:32

标签: c# xml

我需要尽快验证并在套接字上接收下一个xml数据。

我正在使用此方法来验证收到的xml-datas。

private validateRecievedXmlCallback()
{
  try
  {      
    XmlReader xreader = XmlReader.Create(new StringReader(xmlData));
    while (xreader.Read()) ;
  }
  catch (Exception)
  {
    return false;
  }

  return true;
}

但我认为这种方法效率不高。我实际上只需要检查最后一个标签。

示例:

<test valueA="1" valueB="2">
   <data valueC="1" />
   <data valueC="5" />
   <data valueC="5">220</data>
</test>  //I need to check if </test> tag closed, but whats the best way to do it?

2 个答案:

答案 0 :(得分:6)

如果你坚持使用XmlReader,你可以使用XmlReader.Skip(),它会跳过当前元素的内容。

所以

xreader.ReadStartElement("test"); // moves to document root, throws if it is not <test>
xreader.Skip(); // throws if document is not well-formed, e.g. root has no closing tag.

正如其他评论者已经说过的那样,除了使用XML解析器之外,没有什么好方法可以保证XML文档的良好格式。

答案 1 :(得分:1)

任何人都面临与OP相同的挑战:请参阅the answer by Sven Künzler,不要再考虑再次构建自己的XML“验证”。


修改:添加了自动关闭标记正则表达式检查。

Edit2:制作正则表达式实际上是按照

进行的

编辑3:编辑双关闭标记检查(提示 RichardW1001

private validateRecievedXmlCallback(IAsyncResult ar)
{
    string sPattern = @"^<test([^>]*) \/>$";
    if (System.Text.RegularExpressions.Regex.IsMatch(xmlData, sPattern))
    {
        return(true);
    }

    int first_occurence = xmlData.IndexOf("</test>");
    int last_occurence  = xmlData.LastIndexOf("</test>");
    return((first_occurence != -1) && (first_occurence == last_occurence));
}

免责声明:通过正则表达式,IndexOf()或任何其他“自行开发”方法尝试“验证”XML通常是一个愚蠢的想法。只需使用正确的XML解析器。