使用XmlReader读取xml

本文关键字:xml 读取 XmlReader 使用 | 更新日期: 2023-09-27 18:10:17

这是我要读取的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>

现在,当我读取它时,我成功地获得了元素'servers',我可以读取其innerxml,即创建了正确的节点。但是当我创建一个带有元素"server"的节点时,该节点是空的。我猜原因是"服务器"节点中使用的起始和结束元素的简短形式。但我的问题是,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);
}

使用XmlReader读取xml

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

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

节点被认为是空的,因为它使用了缩写形式。没有元素"content",但是有属性。

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

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...
                 });

XmlDocument有一个名为"GetNodes"的方法,它将帮助您。