【问题标题】:Reading xml with XmlReader使用 XmlReader 读取 xml
【发布时间】:2014-06-25 11:46:12
【问题描述】:

这是我要阅读的xml

<servers>
   <server name=" PIOU PIOU || OPTIMAL" ca="1" continent_code="EU" 
           country="France" country_code="FR" ip="s1.mymumble.fr" 
           port="20129" region="" url="http://www.mymumble.fr" />
</servers>

现在,当我阅读它时,我成功获得了元素“服务器”,并且我也可以阅读它的 innerxml,即创建了正确的节点。但是当我使用元素“服务器”创建一个节点时,该节点是空的。 我猜原因是“服务器”节点中使用的起始和结束元素的缩写形式。 但我的问题是xml来自某个远程服务器,我无法修改它,所以我必须按照它的编写方式阅读它。

这是我读取 XML 的代码:

List<XmlNode> nodeList = new List<XmlNode>();
XmlDocument doc = new XmlDocument();

while (reader.Read())
{
    //keep reading until we see my element
    if (reader.Name.Equals("server") && (reader.NodeType == XmlNodeType.Element))
    {
        XmlNode myNode = doc.ReadNode(reader);
        Debug.Log(reader.IsEmptyElement ? "its empty" : "not empty");
        //this always prints "its empty"        
        nodeList.Add(myNode);
    }        
}

foreach( XmlNode node in nodeList)
{
    Debug.Log("child:\t"+node.FirstChild.InnerXml);
}

【问题讨论】:

  • "但是当我使用元素'server'创建一个节点时...这是什么意思??您使用 XmlReader 是否有原因?用LinqToXml不是更方便吗?
  • 如您所见,节点服务器有很多信息,例如名称、国家/地区等,但我通过 'doc.ReadNode(reader)' 创建的那个节点中没有任何信息使用 XmlReader 的具体原因。

标签: c# xml xmlreader


【解决方案1】:

请参阅IsEmptyElement 的文档。特别是这个例子:

<item num="123"/> (IsEmptyElement is true).
<item num="123"></item> (IsEmptyElement is false, although element content is empty).

您的节点被认为是空的,因为它使用的是缩写形式。没有元素“内容”,但有属性。

您是否检查过您创建的节点(即myNode)以查看它是否包含属性?

【讨论】:

  • 是的,吉姆,这就是我所缺少的,应该看看 emptyElement 的真正含义,它相当混乱。不管怎样,谢谢。 :)
【解决方案2】:

XmlReader 对您的需求来说是一种低级...

用 Linq2Xml 解析 XML 不是更容易吗?

var xmlStr = @"<servers>
   <server name="" PIOU PIOU || OPTIMAL"" ca=""1"" continent_code=""EU"" 
           country=""France"" country_code=""FR"" ip=""s1.mymumble.fr"" 
           port=""20129"" region="""" url=""http://www.mymumble.fr"" />
</servers>";


var doc = XDocument.Parse(xmlStr);
var servers = doc.Root.Elements("server")
                 .Select(e => new{
                    name = (string)e.Attribute("name"),
                    ca = (int)e.Attribute("ca"),
                    country = (string)e.Attribute("country")
                    //etc...
                 });

【讨论】:

    【解决方案3】:

    XmlDocument 有一个名为“GetNodes”的方法,可以帮助你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2011-01-27
      • 2012-10-20
      • 1970-01-01
      • 2014-03-20
      • 2013-09-08
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多