Чтобы проверить, является ли XML-документ правильно сформированным с использованием XmlReader, вы должны прочитать документ.
В 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()
Нет необходимости управлять стеком элементов, как предлагается в другой ответ . XmlReader сделает это за вас.
Вы писали:
Когда я создаю XML-ридер, он не выдает никаких ошибок. Есть ли способ сделать проверку синтаксиса автоматически, как это делает XMLDocument?
Главное, что нужно понять, это то, что XmlReader - это объект, который читает xml . Если вы просто создаете его, он еще не прочитал xml, поэтому, конечно, он не может сказать вам, является ли xml (который он не прочитал) действительным.
Чтобы проверить синтаксис или правильно сформированный XML, быстро вызывайте Read () в XmlReader до тех пор, пока он не вернет ноль. Это сделает проверку для вас. Но поймите, что, как только вы это сделаете, 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;
...
}
}