【问题标题】:Nested XML node not lining up correctly嵌套 XML 节点未正确排列
【发布时间】:2016-05-27 11:59:50
【问题描述】:

我正在尝试生成以下 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?

【问题讨论】:

  • 更改自:MyRoot.Add(Internal);收件人:Customers.Add(Internal);

标签: c# .net xml xelement


【解决方案1】:

MyRoot 是您的根 Application 元素。这就是您要添加licencestypeinternal 的地方,这样它们就会被写入。

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

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

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 以获得工作演示。

【讨论】:

    猜你喜欢
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多