我需要尽快验证并在套接字上接收下一个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?
答案 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解析器。