嵌套的XML节点未正确排列

时间:2016-05-27 11:59:50

标签: c# .net xml xelement

我正在尝试生成以下XML

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Application>
    <organisation>
        <organisation_id>0</organisation_id>
    </organisation>
    <address>
        <address1>12345</address1>
        <address2>qqqqq</address2>
        <address3>ddddd</address3>
    </address>
    <Customer>
        <custID>652</custID>
        <address1>12345</address1>
        <references>
            <f_ref>456789</f_ref>

            <licenses>
                <id>3654</id>
                <image>\photo\123.jpg</image>
            </licenses>

        </references>

        <type>
            <sort>1</sort>
            <date>12/12/1997</date>
        </type>
        <internal>
            <auto>true</auto>
            <deliver>true</deliver>
        </internal>
    </Customer>
</Application>

因此我有以下代码:

MyDocument MyDoc = new MyDocument(
        new XDeclaration("1.0", "utf-8", "no"));
        XElement MyRoot = new XElement("Application",
                new XElement("organisation",
                    new XElement("organisation_id", "0")),
                    new XElement("address",
                        new XElement("address1", "123456"),
                        new XElement("address2", "qqqqq"),
                        new XElement("address3", "ddddd")));
        MyDoc.Add(MyRoot);

        foreach (var c in GetCustomers())
        {
            XElement Customers = new XElement("Customer",
                            new XElement("custID", "652"),
                                        new XElement("address1", "12345")),
                                            new XElement("references",
                                            new XElement("f_ref", "456789")));
            MyRoot.Add(Customers);

            foreach (License l in c.Licenses)
            {
                XElement Licenses = new XElement("licenses",
                      new XElement("id", "3654"),
                      new XElement("image", "\photo\123.jpg"));
                MyRoot.Add(Licenses);
            }


            XElement Type = new XElement("type",
                          new XElement("sort", "1"),
                          new XElement("date", "12/12/1997"));
            MyRoot.Add(Type);

            XElement Internal = new XElement("internal",
                new XElement("auto", "true"),
                new XElement("deliver", "true"));
            MyRoot.Add(Internal);
        }

生成以下XML

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Application>
  <organisation>
    <organisation_id>0</organisation_id>
  </organisation>
  <address>
    <address1>12345</address1>
    <address2>qqqqq</address2>
    <address3>ddddd</address3>
  </address>
  <Customer>
    <custID>652</custID>
    <address1>12345</address1>
    <references>
      <f_ref>456789</f_ref>
    </references>
  </Customer>
  <licenses>
    <id>3654</id>
    <image>\photo\123.jpg</image>
  </licenses>
  <type>
    <sort>1</sort>
    <date>12/12/1997</date>
  </type>
  <internal>
    <auto>true</auto>
    <deliver>true</deliver>
  </internal>
</Application>

我已经移动了MyRoot.Add方法,甚至尝试在XElement内添加foreach循环(这给我一个语法错误),但我不确定如何生成XML im?< / p>

1 个答案:

答案 0 :(得分:0)

MyRoot是您的根Application元素。这就是你要添加licencestypeinternal的地方,这就是他们写作的地方。

您应该将它们添加到customers,因此请Customers.Add使用typeinternallicences应该包含在references构造函数中 - 尽管以与referencestype类似的方式提取internal的内容可能更容易。

所以,经过一些重新安排来编译代码之后:

var doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "no"));

var root = new XElement("Application",
    new XElement("organisation",
        new XElement("organisation_id", "0")),
    new XElement("address",
        new XElement("address1", "123456"),
        new XElement("address2", "qqqqq"),
        new XElement("address3", "ddddd")));

doc.Add(root);

var customers = new XElement("Customer",
    new XElement("custID", "652"),
    new XElement("address1", "12345")
    );

root.Add(customers);

var references = new XElement("references",
    new XElement("f_ref", "456789"));

var licenses = new XElement("licenses",
    new XElement("id", "3654"),
    new XElement("image", @"\photo\123.jpg"));

references.Add(licenses);

var type = new XElement("type",
    new XElement("sort", "1"),
    new XElement("date", "12/12/1997"));

customers.Add(type);

var @internal = new XElement("internal",
    new XElement("auto", "true"),
    new XElement("deliver", "true"));

customers.Add(@internal);

有关正常工作的演示,请参阅this fiddle

相关问题