【问题标题】:Add child elements to XML将子元素添加到 XML
【发布时间】:2013-07-19 01:15:33
【问题描述】:

有人能给我指明正确的方向吗?

我想做的是从 WebMethod 获取输出:

我从数据库中获取值;

1694.152344;1694.092285;1693.972168;1693.852051
2013-07-10 20:00:00;2013-07-10 19:00:00;2013-07-10 18:00:00;2013-07-10 17:00:00

我的 XML:

<?xml version="1.0" encoding="utf-8"?>
<FieldsRoot xmlns="http://appserver.weevio.se/schema/SDKr1/Fields.xsd">
<Fields ok="true" nodeId="TEST_1.HW">
    <Numeric value="1694.152344" datum="2013-07-10 20:00:00" status="16" />
    <Numeric value="1694.092285" datum="2013-07-10 19:00:00" status="16" />
    <Numeric value="1693.972168" datum="2013-07-10 18:00:00" status="16" />
    <Numeric value="1693.852051" datum="2013-07-10 17:00:00" status="16" />
</Fields>
</FieldsRoot>

我的代码是这样的:

[WebMethod]
public XElement Sum2()
{

    XNamespace defaultNamespace = XNamespace.Get("http://appserver.weevio.se/schema/SDKr1/Fields.xsd");
    XElement test = new XElement(new XElement(defaultNamespace + "FieldsRoot"));

    string value = "1694.152344;1694.092285;1693.972168;1693.852051";
    string datum = "2013-07-10 20:00:00;2013-07-10 19:00:00;2013-07-10 18:00:00;2013-07-10 17:00:00";

    string[] valueA = value.Split(';');
    string[] datumA = datum.Split(';');

    int d = 0;
    foreach (var customer in valueA)
    {
        XElement xElement = new XElement(defaultNamespace + "Numeric",
                new XAttribute("value", valueA[d]),
                new XAttribute("datum", datumA[d]),
                new XAttribute("status", 16)
        );
        test.Add(new XElement(defaultNamespace + "Fields", new XAttribute("ok", "true"), new XAttribute("nodeId", "TEST.HW"), xElement));
        d = d + 1;
    }
    return test;
}

我得到的是:

<?xml version="1.0" encoding="utf-8"?>
<FieldsRoot xmlns="http://appserver.weevio.se/schema/SDKr1/Fields.xsd">
  <Fields ok="true" nodeId="TEST.HW">
    <Numeric value="1694.152344" datum="2013-07-10 20:00:00" status="16" />
  </Fields>
  <Fields ok="true" nodeId="TEST.HW">
    <Numeric value="1694.092285" datum="2013-07-10 19:00:00" status="16" />
  </Fields>
  <Fields ok="true" nodeId="TEST.HW">
    <Numeric value="1693.972168" datum="2013-07-10 18:00:00" status="16" />
  </Fields>
  <Fields ok="true" nodeId="TEST.HW">
    <Numeric value="1693.852051" datum="2013-07-10 17:00:00" status="16" />
  </Fields>
</FieldsRoot>

【问题讨论】:

    标签: c# xml foreach webmethod xelement


    【解决方案1】:

    您每次都在添加字段元素。这不是 XML 问题,而是逻辑问题。您的问题是您在 for 循环中添加了 hte“字段”元素。构建所有元素,然后将它们全部添加到单个“字段”元素中。或者,先构建 fields 元素,然后将子元素添加到其中。这是一个显示差异的示例控制台应用程序。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml.Linq;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Sum2().ToString());
                Console.WriteLine();
                Console.WriteLine(Sum2Working().ToString());
                Console.Read();
            }
    
            public static XElement Sum2()
            {
    
                XNamespace defaultNamespace = XNamespace.Get("http://appserver.weevio.se/schema/SDKr1/Fields.xsd");
                XElement test = new XElement(new XElement(defaultNamespace + "FieldsRoot"));
    
                string value = "1694.152344;1694.092285;1693.972168;1693.852051";
                string datum = "2013-07-10 20:00:00;2013-07-10 19:00:00;2013-07-10 18:00:00;2013-07-10 17:00:00";
    
                string[] valueA = value.Split(';');
                string[] datumA = datum.Split(';');
    
                int d = 0;
                foreach (var customer in valueA)
                {
                    XElement xElement = new XElement(defaultNamespace + "Numeric",
                            new XAttribute("value", valueA[d]),
                            new XAttribute("datum", datumA[d]),
                            new XAttribute("status", 16)
                    );
                    test.Add(new XElement(defaultNamespace + "Fields", new XAttribute("ok", "true"), new XAttribute("nodeId", "TEST.HW"), xElement));
                    d = d + 1;
                }
                return test;
            }
    
            public static XElement Sum2Working()
            {
    
                XNamespace defaultNamespace = XNamespace.Get("http://appserver.weevio.se/schema/SDKr1/Fields.xsd");
                XElement test = new XElement(new XElement(defaultNamespace + "FieldsRoot"));
    
                string value = "1694.152344;1694.092285;1693.972168;1693.852051";
                string datum = "2013-07-10 20:00:00;2013-07-10 19:00:00;2013-07-10 18:00:00;2013-07-10 17:00:00";
    
                string[] valueA = value.Split(';');
                string[] datumA = datum.Split(';');
    
                int d = 0;
    
                var fields = new List<XElement>();
    
                foreach (var customer in valueA)
                {
                    XElement xElement = new XElement(defaultNamespace + "Numeric",
                            new XAttribute("value", valueA[d]),
                            new XAttribute("datum", datumA[d]),
                            new XAttribute("status", 16)
                    );
                    fields.Add(xElement);
                    d = d + 1;
                }
    
                test.Add(new XElement(defaultNamespace + "Fields", new XAttribute("ok", "true"), new XAttribute("nodeId", "TEST.HW"), fields));
    
                return test;
            }
        }
    }
    

    如您所见,Sum2Working() 将元素添加到列表中,然后将列表添加到较大的元素中。

    【讨论】:

    • 我明白你的意思。我怎么做?对于 C# 和面向对象的语言,我完全是个新手
    • 当我创建一个“Fields”元素(在循环之前)并且在循环中我只像你一样添加一个“Nuberic”元素,它永远不会关闭一个“Fields”标签
    • 谢谢 deltree!这正是我想做的。
    【解决方案2】:

    你需要移动

    test.Add(new XElement(defaultNamespace + "Fields", new XAttribute("ok", "true"), new XAttribute("nodeId", "TEST.HW"), xElement));
    

    在 foreach 循环之外以实现这一点。

    试试

    [WebMethod]
    public XElement Sum2()
    {
    XNamespace defaultNamespace = XNamespace.Get("http://appserver.weevio.se/schema/SDKr1/Fields.xsd");
    XElement test = new XElement(new XElement(defaultNamespace + "FieldsRoot"));
    
    string value = "1694.152344;1694.092285;1693.972168;1693.852051";
    string datum = "2013-07-10 20:00:00;2013-07-10 19:00:00;2013-07-10 18:00:00;2013-07-10 17:00:00";
    
    string[] valueA = value.Split(';');
    string[] datumA = datum.Split(';');
    
    int d = 0;
    
    Xelement numericElement = new Xelement(); 
    foreach (var customer in valueA)
    {
        XElement xElement = new XElement(defaultNamespace + "Numeric",
                new XAttribute("value", valueA[d]),
                new XAttribute("datum", datumA[d]),
                new XAttribute("status", 16)
        );
        numericElement.Add(xElement);
        d = d + 1;
    }
    test.Add(new XElement(defaultNamespace + "Fields", new XAttribute("ok", "true"), new XAttribute("nodeId", "TEST.HW"), numericElement));
    return test;
    

    }

    【讨论】:

    • 如果我这样做,那么我会收到一个错误:“名称 xElement 不在当前上下文中”