将 XML 文件读入 XmlDocument 时如何忽略注释? [复制]
Posted
技术标签:
【中文标题】将 XML 文件读入 XmlDocument 时如何忽略注释? [复制]【英文标题】:How to ignore comments when reading a XML file into a XmlDocument? [duplicate] 【发布时间】:2011-02-21 23:19:05 【问题描述】:我正在尝试使用 C# 读取 XML 文档,我正在这样做:
XmlDocument myData = new XmlDocument();
myData.Load("datafile.xml");
不管怎样,我在阅读 XmlNode.ChildNodes 时有时会遇到 cmets。
为了让有相同需求的人受益,我最后是这样做的:
/** 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;
谢谢 托马索
【问题讨论】:
【参考方案1】:如果您想使用 XmlDocument 而不是 XmlReader,最好按名称或使用 XPath 引用子节点。
那你就不用担心cmet已经添加了,或者其他节点,或者顺序有没有变化。
XmlDocument myData = new XmlDocument();
myData.Load("datafile.xml");
XmlNode DocNode = myData.DocumentElement;
XmlNode Child = DocNode ["SomeChildNode"];
这将选择根元素的子元素“SomeChildNode”。
下一个示例将遍历books.xml 中的所有书籍并打印作者。它使用字符串属性选择器和 Xpath。它应该不受 cmets 等的影响。
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】: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-->
【讨论】:
【参考方案3】:您可以使用 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
从here找到)
【讨论】:
这不包括 cmets,但不包括 /* */ 它们也是有效的 XML cmets(使用 w3c 验证器检查)...【参考方案4】:您可以简单地在您的 ChildNode 上添加过滤器。例如
var children = myNode.ChildNodes.Cast<XmlNode>().Where(n => n.NodeType != XmlNodeType.Comment);
或者,您可以加载传入 XmlReader 的 XmlDocument,其设置使 XmlReaderSettings.IgnoreComments 为 true。
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】:使用XmlReaderSettings
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreComments = true;
XmlReader reader = XmlReader.Create(sourceFilePath, readerSettings);
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(reader);
【讨论】:
【参考方案6】:foreach(XmlNode node in nodeList)
if(node.NodeType != XmlNodeType.Comment)
...
【讨论】:
或者,为了可读性,将过滤器提升到循环之外:foreach(XmlNode node in nodeList.Where(node => node.NodeType != XmlNodeType.Comment)) ...以上是关于将 XML 文件读入 XmlDocument 时如何忽略注释? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
将带有“&”的 XML 读入 C# XMLDocument 对象