使用XmlReader读取xml

时间:2014-06-25 11:46:12

标签: c# xml xmlreader

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

现在当我阅读它时,我成功获得了elemnt'服务器',我也可以读取它的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);
}

3 个答案:

答案 0 :(得分:2)

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

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

您的节点被视为空,因为它使用短格式。没有元素&#34;内容,&#34;但是属性。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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