我有一个包含语法错误的XML文件。如。

<Viewport thisisbad Left="0" Top="0" Width="1280" Height="720" >

当我创建一个XML阅读器时,它不会抛出任何错误。有一种方法可以像xmldocument那样自动进行语法检查吗?
我试过设置各种xmlreadersettings标志,但没有发现任何有用的东西。

最佳答案

要使用xmlreader检查xml文档的格式是否正确,必须实际读取该文档。
在C_中,这将执行以下操作:

var txt = "<Viewport thisisbad Left='0' Top='0' Width='1280' Height='720' >";
XmlReader reader = XmlReader.Create(new StringReader(txt));
while (reader.Read()) { }

运行该代码得到的结果是:
Exception: System.Xml.XmlException: 'Left' is an unexpected token. The expected token is '='. Line 1, position 21.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
   at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(String expectedToken1, String expectedToken2)
   at System.Xml.XmlTextReaderImpl.ParseAttributes()
   at System.Xml.XmlTextReaderImpl.ParseElement()
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()

不需要管理一堆元素,如another answer中所建议的。XmlReader是为您做的。
你写道:
当我创建一个XML阅读器时,它不会抛出任何错误。有一种方法可以像xmldocument那样自动进行语法检查吗?
要认识到的关键是,xmlreader是一个读取xml的对象。如果您只是创建它,它还没有读取任何xml,因此它当然不能告诉您xml(它没有读取)是否有效。
若要快速检查XML的语法或格式是否正确,请对XmlReader调用read(),直到它返回空值。它会帮你检查的。但是,要意识到,一旦您这样做了,xmlreader就在文档的末尾。为了实际读取和检查xml的内容,需要重置。我见过的大多数应用程序都同时执行这两种操作。换句话说,应用程序检查内容,并将您所说的“语法检查”委托给读者:
XmlReader reader = XmlReader.Create(sr);
while (reader.Read())  // will throw if not well-formed
{
    switch (reader.NodeType)
    {
        case XmlNodeType.XmlDeclaration:
            ...
            break;
        case XmlNodeType.Element:
            ...
            break;
        case XmlNodeType.Text:
            ...
            break;
        ...
    }
}

关于c# - XMLReader:如何捕获xml文件中的语法错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2786495/

10-11 04:09