Подтвердить что ты не робот

Как игнорировать комментарии при чтении XML файла в XmlDocument?

Я пытаюсь прочитать XML-документ с С#, я делаю это следующим образом:

XmlDocument myData = new XmlDocument();
myData.Load("datafile.xml");

В любом случае, иногда я получаю комментарии при чтении XmlNode.ChildNodes.

В интересах тех, кто испытывает то же требование, вот как я это сделал в конце:

/** Validate a file, return a XmlDocument, exclude comments */
private XmlDocument LoadAndValidate( String fileName )
{
    // Create XML reader settings
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.IgnoreComments = true;                         // Exclude comments
    settings.ProhibitDtd = false;                           
    settings.ValidationType = ValidationType.DTD;           // Validation

    // Create reader based on settings
    XmlReader reader = XmlReader.Create(fileName, settings);

    try {
        // Will throw exception if document is invalid
        XmlDocument document = new XmlDocument();
        document.Load(reader);
        return document;
    } catch (XmlSchemaException) {
        return null;
    }
}

Спасибо,
Томмазо

4b9b3361

Ответ 2

foreach(XmlNode node in nodeList)
  if(node.NodeType != XmlNodeType.Comment)
     ...

Ответ 3

Вы можете просто добавить фильтр в свои дочерние узлы. Например.

var children = myNode.ChildNodes.Cast<XmlNode>().Where(n => n.NodeType != XmlNodeType.Comment);

В качестве альтернативы вы можете загрузить XmlDocument, проходящую в XmlReader, с настройками, такими как XmlReaderSettings.IgnoreComments.

using (var file = File.OpenRead("datafile.xml"))
{
    var settings = new XmlReaderSettings() { IgnoreComments = true, IgnoreWhitespace = true };
    using (var xmlReader = XmlReader.Create(file, settings))
    {
        var document = new XmlDocument();
        document.Load(xmlReader);

        // Process document nodes...
    }
}

Ответ 4

использовать XmlReaderSettings

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreComments = true;
XmlReader reader = XmlReader.Create(sourceFilePath, readerSettings);
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(reader);

Ответ 5

Dim pattern As String = String.Empty
Dim xDoc As XmlDocument = New XmlDocument()

xDoc.Load(path)

''Pattern of comments
pattern = "(<!--.*?--\>)"
xDoc.InnerXml = Regex.Replace(xDoc.InnerXml, pattern, String.Empty, RegexOptions.Singleline)

<!--aftr this run ur code-->

Ответ 6

Если вы хотите использовать XmlDocument вместо XmlReader, вам может быть лучше обратиться к дочерним узлам по имени или с помощью XPath.

Тогда вам не нужно беспокоиться о добавленных комментариях или других узлах или при изменении порядка.

XmlDocument myData = new XmlDocument();
myData.Load("datafile.xml");

XmlNode DocNode = myData.DocumentElement;

XmlNode Child = DocNode ["SomeChildNode"];

Это выберет "SomeChildNode", дочерний элемент корневого элемента.

Следующий пример будет охватывать все книги в books.xml и печатать автора. Он использует селектор свойств строки и Xpath. Комментарии не должны зависеть от них.

XmlDocument myData = new XmlDocument();
myData.Load("books.xml");

XmlNode DocNode = myData.DocumentElement;

XmlNodeList BookNodeList = DocNode.SelectNodes("./book");

foreach (XmlNode Book in BookNodeList)
{
    Console.WriteLine(Book["author"].InnerText);
}

Обратите внимание, что с XPath вы могли бы легко найти все элементы книги в документе, используя что-то вроде ".//book".

books.xml:

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
<catalog>

Литература:

Свойство XmlNode.Item(строка) hxxp://msdn.microsoft.com/en-us/library/sss31aas.aspx XmlNode.SelectNodes Метод (String) http://msdn.microsoft.com/en-us/library/hcebdtae.aspx XmlNode.SelectSingleNode Method (String) http://msdn.microsoft.com/en-us/library/fb63z0tw.aspx