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
XmlReader
と XmlReaderSettings.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
)
foreach(XmlNode node in nodeList)
if(node.NodeType != XmlNodeType.Comment)
...
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...
}
}
XmlReaderSettings
を使用します
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreComments = true;
XmlReader reader = XmlReader.Create(sourceFilePath, readerSettings);
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(reader);
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
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-->