【问题标题】:C# read XML File and select NodesC# 读取 XML 文件并选择节点
【发布时间】:2017-03-13 22:04:22
【问题描述】:

我尝试从 XML 文件中读取。 XML 文件是使用 c# XmlSerializer 创建的。

xml文件看起来像

<command>
   <Name>one</Name>
   <data>
     <int>46</int>
     <int>49</int>
     <int>50</int>
   </data>
   <rangeData>
     <int>36</int>
     <int>29</int>
     <int>10</int>
   </rangeData>
</command>

要读取 xml 文件,我使用以下代码

string filename = "01.xml";
XmlDocument xdc = new xmlDocument();
xdc.Load(filename);
XmlNodeList xnlNodes = xelRoot.SelectNodes("command");

foreach(XMLNode nxmNode in xnlNodes)
{
  XmlElement element = (XmlElement)xndNode;

  string Name = Convert.ToString(xndNode{"Name"].InnerText);

   data = new int[]
   {
     Convert.ToInt32(element.GetElementsByTagName("int")[0].InnerText),
     Convert.ToInt32(element.GetElementsByTagName("int")[1].InnerText),
     Convert.ToInt32(element.GetElementsByTagName("int")[2].InnerText),
   };

   rangeData = new int[]
   {
     Convert.ToInt32(element.GetElementsByTagName("int")[0].InnerText),
     Convert.ToInt32(element.GetElementsByTagName("int")[1].InnerText),
     Convert.ToInt32(element.GetElementsByTagName("int")[2].InnerText),
   };
  }
}

我的问题是,我不知道如何选择正确的子节点。我希望有人可以帮助我。谢谢

【问题讨论】:

  • 你的问题是什么?什么不工作?你要达到什么目的?看一下称为 xpath 的技术。这对你有很大帮助。

标签: c# xml


【解决方案1】:

以下是如何使用您的方法:

        string filename = "01.xml";
        XmlDocument xdc = new XmlDocument();
        xdc.Load(filename);
        XmlNodeList xnlNodes = xdc.SelectNodes("command");

        foreach (XmlNode xnlNode in xnlNodes)
        {
            XmlElement element = (XmlElement)xnlNode;

            string Name = Convert.ToString(xnlNode["Name"].InnerText);
            int[] data = new int[]
                {
 Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[0].InnerText),
 Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[1].InnerText),
 Convert.ToInt32(element.GetElementsByTagName("data")[0].ChildNodes[2].InnerText)
                };

            int[] rangeData = new int[]
                {
 Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[0].InnerText),
 Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[1].InnerText),
 Convert.ToInt32(element.GetElementsByTagName("rangeData")[0].ChildNodes[2].InnerText)
                };
        }

【讨论】:

  • 感谢您的快速回复
【解决方案2】:

这是一个如何使用 xpath 访问节点的示例

    XmlDocument xdc = new XmlDocument();
    xdc.Load(filename);
    var nodes = xdc.SelectNodes("command/data/int");
    foreach (XmlNode node in nodes)
    {
        string s = node.InnerText;
    }

要了解有关 XPath 的更多信息,请查看this tutorial

【讨论】:

  • 感谢您的快速回复
【解决方案3】:

我建议使用 LINQ 来读取 XML:

var xdoc = XDocument.Load(filename);
var cmd = xdoc.Root;
var command = new {
   Name = (string)cmd.Element("Name"),
   Data = cmd.Element("data").Elements().Select(e => (int)e).ToList(),
   RangeData = cmd.Element("rangeData").Elements().Select(e => (int)e).ToList()
};

输出:

{
  Name: "one",
  Data: [ 46, 49, 50 ],
  RangeData: [ 36, 29, 10 ]
}

如果您没有提供整个 xml,而只提供了其中的一部分,并且实际上您有很多命令,那么解析将如下所示

var commands =
      from cmd in xdoc.Descendands("command")
      select new {
         Name = (string)cmd.Element("Name"),
         Data = cmd.Element("data").Elements().Select(e => (int)e).ToList(),
         RangeData = cmd.Element("rangeData").Elements().Select(e => (int)e).ToList()
      }

【讨论】:

  • 感谢您的快速回复
【解决方案4】:

你可以在这里使用 XPath

void Main()
{
    var doc = new XmlDocument();
    doc.LoadXml(xml);   

    var name = doc.DocumentElement
        .SelectSingleNode("/command/Name")
        .InnerText;

    var data = doc.DocumentElement
        .SelectNodes("/command/data/int")
        .OfType<XmlNode>()
        .Select(x=> Int32.Parse(x.InnerText))
        .ToArray(); 

    var rangeData = doc.DocumentElement
        .SelectNodes("/command/rangeData/int")
        .OfType<XmlNode>()
        .Select(x => Int32.Parse(x.InnerText))
        .ToArray();
}


string xml = @"
<command>
   <Name>one</Name>
   <data>
     <int>46</int>
     <int>49</int>
     <int>50</int>
   </data>
   <rangeData>
     <int>36</int>
     <int>29</int>
     <int>10</int>
   </rangeData>
</command>
";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多