在.Net中生成XML

时间:2015-10-07 13:58:28

标签: c# xml

我正在尝试使用以下格式生成XML:

<ImportSession>
  <Batches>
    <Batch>
      <BatchFields>
        <BatchField Name="Field1" Value="1" />
        <BatchField Name="Field2" Value="2" />
        <BatchField Name="Field3" Value="3" />
      </BatchFields>
    <Batch>
  <Batches>
</ImportSession>

我有以下代码:

XmlDocument doc = new XmlDocument();
XmlElement importSession = doc.CreateElement("ImportSession");
XmlElement batches = doc.CreateElement("Batches");
XmlElement batch = doc.CreateElement("Batch");
XmlElement batchFields = doc.CreateElement("BatchField");
doc.AppendChild(importSession);

XmlNode importSessionNode = doc.FirstChild;
importSessionNode.AppendChild(batches);

XmlNode batchesNode = importSessionNode.FirstChild;
batchesNode.AppendChild(batch);
XmlNode batchNode = batchesNode.FirstChild;

int numBatchFields = 9;
for (int j = 0; j < numBatchFields; j++)
{
    batchNode.AppendChild(batchFields);

    XmlElement batchfields = (XmlElement)batchNode.FirstChild;
    batchfields.SetAttribute("Name", "BatchPrevSplit");
    batchfields.SetAttribute("Value", j.ToString());
}

我的问题是它没有添加批处理字段标记。它增加一个,所以我得到:

<ImportSession>
  <Batches>
    <Batch>
      <BatchField Name="BatchPrevSplit" Value="8" />
    </Batch>
  </Batches>
</ImportSession>

似乎是因为我试图将相同的Child元素添加到batchNode节点,它只是覆盖现有标记中的数据。 我试过放入

XmlElement batchfields = (XmlElement)batchNode.ChildNodes.Item(j);

而不是

XmlElement batchfields = (XmlElement)batchNode.FirstChild; 

但如果我使用相同的元素,那么它不会将另一个Child附加到batchNode,因此只有一个子节点。那么有人能告诉我如何实现这一目标吗?

2 个答案:

答案 0 :(得分:3)

像这样重写你的for循环:

for (int j = 0; j < numBatchFields; j++)
{
    XmlElement batchFields = doc.CreateElement("BatchField");
    batchFields.SetAttribute("Name", "BatchPrevSplit");
    batchFields.SetAttribute("Value", j.ToString());

    batchNode.AppendChild(batchFields);
}

答案 1 :(得分:3)

LINQ to XML将为您带来痛苦......

var xml = new XElement("ImportSession",
    new XElement("Batches",
            new XElement("Batch",
                new XElement("BatchFields",
                    from j in Enumerable.Range(0,9)
                    select new XElement("BatchField",
                        new XAttribute("Name", string.Format("Field{0}", j)),
                        new XAttribute("Value", j)
                        )
                    )
                )
        )
    );