如何使用XmlReader类迭代xml文件

时间:2014-02-03 13:24:51

标签: c# xml xmlreader

我的xml存储在xml文件中,如下所示

<?xml version="1.0" encoding="utf-8"?>
<metroStyleManager>
  <Style>Blue</Style>
  <Theme>Dark</Theme>
  <Owner>CSRAssistant.Form1, Text: CSR Assistant</Owner>
  <Site>System.ComponentModel.Container+Site</Site>
  <Container>System.ComponentModel.Container</Container>
</metroStyleManager>

这种方式我正在迭代但是有一些小故障

 XmlReader rdr = XmlReader.Create(System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + @"\Products.xml");
            while (rdr.Read())
            {
                if (rdr.NodeType == XmlNodeType.Element)
                {
                    string xx1= rdr.LocalName;
                    string xx = rdr.Value;
                }
            }

它总是变空string xx = rdr.Value; 当元素为style时,值应该是Blue,就像在文件中一样,但我总是空着......你能说出原因吗?

另一个要求是我想在<metroStyleManager></metroStyleManager>

内进行迭代

任何人都可以帮助以上两点。感谢

3 个答案:

答案 0 :(得分:1)

BlueText节点的值,而不是Element节点的值。你需要添加另一个if来获取文本节点的值,或者你可以读取当前元素节点的内部xml:

rdr.MoveToContent();

while (rdr.Read())
{
    if (rdr.NodeType == XmlNodeType.Element)
    {                    
        string name = rdr.LocalName;
        string value = rdr.ReadInnerXml();
    }
}

您还可以使用Linq to Xml获取根子项的名称和值:

var xdoc = XDocument.Load(path_to_xml);
var query = from e in xdoc.Root.Elements()
            select new {
               e.Name.LocalName,
               Value = (string)e
            };

答案 1 :(得分:0)

您可以使用XmlDocument类。

XmlDocument doc = new XmlDocument.Load(filename);
foreach (XmlNode node in doc.ChildNodes)
{
    if (node.ElementName == "metroStyleManager")
    {
        foreach (XmlNode subNode in node.ChildNodes)
        {
            string key = subNode.LocalName; // Style, Theme, etc.
            string value = subNode.Value; // Blue, Dark, etc.
        }
    }
    else
    {
        ...
    }
}

答案 2 :(得分:0)

您可以使用XDocument xDoc = XDocument.Load(strFilePath)来加载XML文件。

然后你可以使用

foreach (XElement xeNode in xDoc.Element("metroStyleManager").Elements())
{
    //Check if node exist
    if (!xeNode.Elements("Style").Any()

    //If yes then
    xeNode.Value
}

希望它能帮助......

BTW,来自 System.XML.Linq.XDocument