web-dev-qa-db-ja.com

XMLファイルをXmlDocumentに読み込むときにコメントを無視するにはどうすればよいですか?

C#で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;
    }
}

ありがとうございました
Tommaso

24
tunnuz

XmlReaderXmlReaderSettings.IgnoreComments trueに設定:

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreComments = true;
using (XmlReader reader = XmlReader.Create("input.xml", readerSettings))
{
    XmlDocument myData = new XmlDocument();
    myData.Load(reader);
    // etc...
}

ここ から XmlDocument ignore comments

40
Mark Byers
foreach(XmlNode node in nodeList)
  if(node.NodeType != XmlNodeType.Comment)
     ...
18
Andre

ChildNodeにフィルターを追加するだけです。例えば。

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

または、XmlReaderSettings.IgnoreCommentsがtrueになるような設定でXmlReaderを渡すXmlDocumentをロードすることもできます。

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...
    }
}
5
Reddog

XmlReaderSettingsを使用します

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

XmlReaderの代わりにXmlDocumentを使用する場合は、名前で子ノードを参照するか、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's 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メソッド(文字列) http://msdn.Microsoft.com/en-us /library/hcebdtae.aspx XmlNode.SelectSingleNodeメソッド(文字列) http://msdn.Microsoft.com/en-us/library/fb63z0tw.aspx

2
Jack Culhane
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-->
2
mihir