【问题标题】:c# Reading XML comment using XDocumentc# 使用 XDocument 读取 XML 注释
【发布时间】:2013-12-10 06:51:27
【问题描述】:

使用XDocument时如何读取xml注释?

XDocument doc = XDocument.Load("joker.xml");
 foreach (XElement element in doc.Descendants("server"))
            {
//I use this to read server tag...
}



<?xml version="1.0" encoding="ISO-8859-1"?>
<ho>
    <!-- For X use only -->
    <servers>
        <server NAME="xx" ></server>

    <!-- Dummy servers  -->
        <server NAME="xx" ></server>
        <server NAME="xx" ></server>
    </servers>
</ho>

【问题讨论】:

  • 很高兴看到 joker.xml 的内容
  • 不重复,因为我想在 Xdocuemnt 中做
  • “评论”是指您想阅读“姓名”属性?我在提供的 XML 结构中没有看到任何称为“注释”的内容。

标签: c# xml


【解决方案1】:

Node 对象是整个 DOM 的主要数据类型。

节点可以是元素节点、属性节点、文本节点或"Node types" chapter.中解释的任何其他节点类型

XML 元素是从(包括)元素的开始标签到(包括)元素的结束标签的所有内容。

     XDocument xdoc = XDocument.Load("");
       foreach (var node in xdoc.Descendants("servers").Nodes())
        {

            if (node is XComment)
            {
                //THEN  READ YOUR COMMENT 

            }

        }

【讨论】:

  • 您不应该总是使用节点。但是,在这种情况下,您应该这样做。
  • 对不起,我会更新,但在这种情况下,这是最好的方法
  • 会返回server cmets 吗?这只是文件中所有 cmets 的转储
  • @Julie 节点将拥有整个 xml 文件。当它检查节点是否是 Xcomment 它说它不是
  • @JohnRyann 我的代码可以工作,但lazyberezovsky 的代码更棘手
【解决方案2】:

读取 xml 时检查节点类型。如果是XComment,那么您正在阅读评论。例如。在您的情况下,服务器元素的上一个节点将是注释:

foreach(var s in doc.Descendants("server"))
{
    var comment = s.PreviousNode as XComment;
    if (comment != null)
        Console.WriteLine(comment.Value); // outputs "Dummy servers"
}

【讨论】:

  • 没有后代会返回一个不同于节点的 xelement
  • @JulieShannon 看看 OP 代码。他想拿cmets做服务器。服务器是元素。
  • 好的,但是这样做你是在过滤所有元素你了解节点和元素之间的区别吗?
  • @JulieShannon 看起来你不明白我的代码是如何工作的
  • 好的,在你更新你的代码之后,它现在可以工作了,我会投票,对不起,我没有看到你的更新
【解决方案3】:

您必须使用 XmlReader.Create 方法并读取它并在节点之间切换以指示当前正在读取的节点 不要被 Create 方法所迷惑……它会读取相关的 xml 文件,但会创建 XmlReader 对象的实例:

http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.create(v=vs.110).aspx

XmlReader xmlRdr = XmlReader.Create("Joker.XML");
// Parse the file
while (xmlRdr.Read())
{
    switch (xmlRdr.NodeType)
    {
        case XmlNodeType.Element:
            // Current node is an Xml Element
            break;
        case XmlNodeType.Comment:
            // This is a comment so do something with xmlRdr.value

...等等

第 2 部分 - 对于那些想要使用 LINQ 的人(并不是说它真的有什么不同)...

XDocument xml = XDocument.Load("joker.xml");
var commentNodes = from n in xml.Descendants("server")
                where n.NodeType == XmlNodeType.Comment
                select n;

foreach(XNode node in commentNodes)
{ 
  // now you are iterating over the comments it has found
}

【讨论】:

  • 不,这不是 Xdocument 的答案,您有 Linq to xml 的支持,他想要解决他的代码而不是新方法
  • 当然可以,但这有什么不同呢? LINQ 真的让阅读变得更容易一些。它不会改变功能。这是表达事物的另一种方式:)。此外,原始问题在 LINQ 上没有显示任何用法。
  • 特别要求使用 XDocument 的解决方案。
  • @Kevin - 谢谢。我在给其他选择。但我理解你的评论并纠正:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 2012-10-13
相关资源
最近更新 更多