【问题标题】:C# Read and Store Data from XMLC# 从 XML 读取和存储数据
【发布时间】:2018-05-07 20:10:35
【问题描述】:

我正在尝试从 xml 文件中读取和存储数据。我一直在阅读有关读取数据的各种方法,例如 XmlReader、XmlTextReader、LinQ 等。 我的 XML 文件是

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <circuit name="local">
      <Device>device1</Device>
      <Point>point1></Point>
    </circuit>
    <circuit name ="remote">
      <Device>device2</Device>
      <Point>point2</Point>
    </circuit>
</configuration>

我正在尝试提取设备和点集,以便将它们传递给数据库查询。我使用此代码和 foreach 循环来验证内容,但它只获取第一组。

XDocument msrDoc = XDocument.Load("BNOC MSR.config");
var data = from item in msrDoc.Descendants("circuit")
           select new
           {
               device = item.Element("Device").Value,
               point = item.Element("Point").Value
           };
foreach (var p in data)
   Console.WriteLine(p.ToString());

我也试过这个,但是我的数组都是空的

 String[] deviceList = new String[1];
 String[] pointList = new String[1];
 int n = 0;

 XmlDocument msrDoc = new XmlDocument();
 msrDoc.Load("BNOC MSR.config");
 var itemNodes = msrDoc.SelectNodes("circuit");
 foreach (XmlNode node in itemNodes)
 {
     var circuit = node.SelectNodes("circuit");
     foreach (XmlNode cir in circuit)
     {
         deviceList[n] = cir.SelectSingleNode("Device").InnerText;
         pointList[n] = cir.SelectSingleNode("Point").InnerText;
     }
 }

任何帮助将不胜感激。

【问题讨论】:

  • 两个注意事项:a)您的 XML 在技术上无效(在您的第一点上的流浪 > 应转义为 >)和 b)在 VS2017/.NET 4.6.2 中我无法重现问题 - 我使用您粘贴的第一个代码块获取这两个元素。您使用的是哪个版本的 .NET?我看到你用 VS2008 标记了它,它是......好吧,说实话......老了。
  • 第一个代码 sn-p 看起来不错。我粘贴到 VS 中,它似乎正在工作,我正在从两个节点获取输出。

标签: c# xml visual-studio linq visual-studio-2008


【解决方案1】:

您确定不想为此使用内置的 Properties.Settings 吗?

Circuit local = Properties.Settings.Default.localCircuit;
Circuit remote = Properties.Settings.Default.remoteCircuit;

https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/using-application-settings-and-user-settings

【讨论】:

  • 我喜欢这个,但是随着电路数量随时间波动,有没有办法迭代它?
  • 是的,您必须编辑设置文件。在此评论中查看批准的答案:stackoverflow.com/questions/1766610/…
【解决方案2】:

我认为您测试结果的方式有问题。代码:

void Main()
{
    var fileLocation = @"C:\BrianTemp\input.txt";
    var xml = File.ReadAllText(fileLocation);

    XDocument msrDoc = XDocument.Load(fileLocation);
    var data = from item in msrDoc.Descendants("circuit")
               select new
               {
                   device = item.Element("Device").Value,
                   point = item.Element("Point").Value
               };
    foreach (var p in data)
    {
        //It is best practice to use statement blocks {} to prevent silly errors.  
        //Sometimes you want to execute multiple statements, especially as code changes later
        Console.WriteLine($"{p}");
    }

}

产生预期的输出:

{ device = device1, point = point1 }
{ device = device2, point = point2 }

你说:

我使用此代码和 foreach 循环来验证内容,但它 只得到第一组。

如您所见,代码产生了应有的 2 个结果。

注意:我更正了 XML 文件以删除多余的 &gt;

&lt;Point&gt;point1&gt;&lt;/Point&gt;

【讨论】:

    【解决方案3】:

    我在您的代码中发现了两个问题(我只尝试了您发布的第二种方法):

    1. 你的字符串数组太小,改成:

      String[] deviceList = new String[1]; String[] pointList = new String[1];

    2. var itemNodes = msrDoc.SelectNodes("circuit"); 应该是

      var itemNodes = msrDoc.SelectNodes("配置");

    【讨论】:

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