通过for循环将一个XML文件插入另一个XML文件(XDocument)

时间:2015-09-03 11:45:18

标签: c# xml list linq-to-xml

这是我之前没做过的事情,所以我可能做错了,如果我有,请告诉我。

我使用XDocument创建了一个根XML文件:

public void SaveReceipt(List<ArticleFull> articles)
{
    XDocument receipt = new XDocument(
        new XDeclaration("1.0", "utf-8", null),
        new XElement("FiscalRecipet")
    );
    ...
}

然后使用for循环尝试遍历articles列表,以便我可以构建一个收据XML文件。

for (int i = 0; i < articles.Count; i++)
{
    int quantity = 1;
    //This while loop just counts how many items are in a row
    while(!(i + 1 > articles.Count - 1))
    {
        if (articles[i].Id == articles[i + 1].Id)
        {
            quantity++;
            i++;
        }
        else break;
    }
    var enternode = new XElement("FiscalItem",
        new XElement("Name", articles[i].Name.ToString()),
        new XElement("Price", articles[i].Price.ToString()),
        new XElement("Quantity", quantity.ToString()),
        new XElement("TaxGroup", articles[i].TaxGroup)
    );
    //Code missing here...
}

现在,如上所述,我完全不知道如何将receipt变量连接到enternode变量。

结束XML文件应该类似于:

<?xml version="1.0" encoding="UTF-8"?>
<FiscalRecipet>
    <FiscalItem>
        <Name>Coffee</Name>
        <Price>130.0</Price>
        <Quantity>1.0</Quantity>
        <TaxGroup>2</TaxGroup>
    </FiscalItem>
    <FiscalItem>
        <Name>Chocolate</Name>
        <Price>350.0</Price>
        <Quantity>2.0</Quantity>
        <TaxGroup>3</TaxGroup>
    </FiscalItem>
    <!-- etc... -->
</FiscalRecipet>

我试着通过谷歌搜索来寻找答案,但我没有那么幸运,这就是为什么我认为我可能走向错误的方向(?)

3 个答案:

答案 0 :(得分:3)

听起来你只需要:

receipt.Root.Add(enternode);

换句话说,将新元素添加到文档的根元素。

使用LINQ,btw可能会有相当简单的方法来完成所有这些工作。我怀疑你想要的东西:

var articlesById = articles
   .GroupBy(article => article.Id)
   .Select(g => new { Article = g.First(), Count = g.Count() });
XDocument receipt = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement("FiscalRecipet",
        articlesById.Select(x => new XElement("FiscalItem",
            new XElement("Name", x.Article.Name),
            new XElement("Price", x.Article.Price),
            new XElement("Quantity", x.Count),
            new XElement("TaxGroup", x.Article.TaxGroup))
    )
);

替换整个代码。

答案 1 :(得分:1)

只需将财务项目添加为财务收据的子项:

var fiscalReceipt = new XElement("FiscalRecipet");
var receipt = new XDocument(new XDeclaration("1.0", "utf-8", null), fiscalReceipt);

for (int i = 0; i < 5; i++)
{
    var enternode = new XElement("FiscalItem",
        new XElement("Name", "foo"),
        new XElement("Price", i * 100),
        new XElement("Quantity", 1),
        new XElement("TaxGroup", "A"));

    fiscalReceipt.Add(enternode);
}

Console.WriteLine(receipt);
<FiscalRecipet>
  <FiscalItem>
    <Name>foo</Name>
    <Price>0</Price>
    <Quantity>1</Quantity>
    <TaxGroup>A</TaxGroup>
  </FiscalItem>
  <FiscalItem>
    <Name>foo</Name>
    <Price>100</Price>
    <Quantity>1</Quantity>
    <TaxGroup>A</TaxGroup>
  </FiscalItem>
  <FiscalItem>
    <Name>foo</Name>
    <Price>200</Price>
    <Quantity>1</Quantity>
    <TaxGroup>A</TaxGroup>
  </FiscalItem>
  <FiscalItem>
    <Name>foo</Name>
    <Price>300</Price>
    <Quantity>1</Quantity>
    <TaxGroup>A</TaxGroup>
  </FiscalItem>
  <FiscalItem>
    <Name>foo</Name>
    <Price>400</Price>
    <Quantity>1</Quantity>
    <TaxGroup>A</TaxGroup>
  </FiscalItem>
</FiscalRecipet>
Press any key to continue . . .

答案 2 :(得分:1)

考虑到FiscalReceipt是根,而FiscalItem是你的元素,你可以做的是尝试方法

root.Add(childElement);

这会将每个FiscalItem添加为FiscalReceipt的子级。

MSDN链接相同: https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.add%28v=vs.110%29.aspx