2013-07-19 8 views
1

Может кто-нибудь поставить меня в правильном направлении?Добавить дочерние элементы в XML

То, что я хочу сделать, это получить выход из 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> 

ответ

1

вы добавляете поля элемента каждый время. Это не проблема XML, а логическая проблема. Ваша проблема заключается в том, что вы добавляете элемент hte "Fields" внутри цикла for. создайте все свои элементы, а затем добавьте их в один элемент «Поля». Или сначала создайте элемент полей, а затем добавьте к нему подэлементы. Вот пример консольного приложения, показывающий разницу.

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() добавляет элементы в список, а затем добавляет список к большому элементу.

+0

Я понимаю, что вы имеете в виду. Как это сделать? Я полностью новичок, когда речь идет о C# и объектно-ориентированных языках. –

+0

Когда я создаю элемент «Поля» (до цикла) и в цикле, я добавляю только элемент «Нуберический», как вы, никогда не закрывает " Fields " –

+0

Я имел в виду –

0

Вы должны переместить

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

Вне цикла Еогеасп для того, чтобы достичь этого.

Попробуйте

[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; 

}

+0

ЕСЛИ Я это сделаю, тогда я получаю сообщение об ошибке: «Имя xElement не в текущем контексте» –

Смежные вопросы