首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将XML解析为平面结构

将XML解析为平面结构
EN

Stack Overflow用户
提问于 2018-09-12 11:30:52
回答 1查看 89关注 0票数 0

我有一个XML文件如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <plc1>
        <ip>192.168.0.170</ip>
        <regread>
            <article>1000</article>
            <prod1>100</prod1>
        </regread>
        <regwrite>
            <registerId>2000</registerId>
            <registerDescription>2100</registerDescription>
            <registerTarget>3100</registerTarget>
        </regwrite>
    </plc1>
    <plc2>
        <ip>192.168.0.171</ip>
        <regread>
            <article>1000</article>
            <prod1>200</prod1>
        </regread>
        <regwrite>
            <registerId>2000</registerId>
            <registerDescription>2100</registerDescription>
            <registerTarget>3200</registerTarget>
        </regwrite>
    </plc2>
    <plc3>
        <ip>192.168.0.172</ip>
        <regread>
            <article>1000</article>
            <prod>300</prod>
        </regread>
        <regwrite>
            <registerId>2000</registerId>
            <registerDescription>2100</registerDescription>
            <registerTarget>3300</registerTarget>
        </regwrite>
    </plc3>
</root>

我必须将这些节点的值存储到像下面这样的C#结构中:

代码语言:javascript
复制
public struct PLC
{
    public string ipAddress;
    public int article;
    public int prod;
    public int registerId;
    public int registerDescription;
    public int registerTarget;
}

我想要创建一个这个结构的数组,以便在可编程控制器中有plc1节点,在PLC1中有plc2等等。

我怎样才能做到这一点?提前谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-12 11:45:04

试试:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<PLC> plcs = doc.Root.Elements().Select(x => new PLC() {
                ipAddress = (string)x.Element("ip"),
                article = (int)x.Descendants("article").FirstOrDefault(),
                prod = (int)x.Descendants().Where(y => y.Name.LocalName.StartsWith("prod")).FirstOrDefault(),
                registerId = (int)x.Descendants("registerId").FirstOrDefault(),
                registerDescription = (int)x.Descendants("registerDescription").FirstOrDefault(),
                registerTarget = (int)x.Descendants("registerTarget").FirstOrDefault()
            }).ToList();


        }
    }
    public class PLC
    {
        public string ipAddress { get; set; }
        public int article { get; set; }
        public int prod { get; set; }
        public int registerId { get; set; }
        public int registerDescription { get; set; }
        public int registerTarget { get; set; }
    }


}

以下是我使用的xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<root>
<plc1>

  <ip>192.168.0.170</ip>

  <regread>
    <article>1000</article>
    <prod1>100</prod1>
  </regread>

  <regwrite>
    <registerId>2000</registerId>
    <registerDescription>2100</registerDescription>
    <registerTarget>3100</registerTarget>
  </regwrite>

</plc1>

<plc2>

  <ip>192.168.0.171</ip>

  <regread>
    <article>1000</article>
    <prod1>200</prod1>
  </regread>

  <regwrite>
    <registerId>2000</registerId>
    <registerDescription>2100</registerDescription>
    <registerTarget>3200</registerTarget>
  </regwrite>

</plc2>

<plc3>

  <ip>192.168.0.172</ip>

  <regread>
    <article>1000</article>
    <prod>300</prod>
  </regread>

  <regwrite>
    <registerId>2000</registerId>
    <registerDescription>2100</registerDescription>
    <registerTarget>3300</registerTarget>
  </regwrite>

</plc3>
</root>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52294118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档