通过 for 循环将一个 XML 文件插入另一个文件 (XDocument)
Inserting one XML file into another via for loop (XDocument)
这是我以前没有做过的事情,所以我可能一开始就做错了,如果我错了,请告诉我。
我用 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>
我尝试通过谷歌搜索来寻找答案,但运气不太好,这就是为什么我认为我可能走错了方向(?)
听起来你只需要:
receipt.Root.Add(enternode);
换句话说,将新元素添加到文档的根元素。
使用 LINQ 可能有更简单的方法来完成所有这些,顺便说一下。我怀疑你想要这样的东西:
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))
)
);
这将替换您的整个代码。
只需将财政项目添加为财政收据的子项:
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 . . .
考虑到 FiscalReceipt 是根,FiscalItem 是您在其中的元素,您可以做的是尝试方法
root.Add(childElement);
这会将每个 FiscalItem 添加为 FiscalReceipt 的子项。
MSDN link 相同:
https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.add%28v=vs.110%29.aspx
这是我以前没有做过的事情,所以我可能一开始就做错了,如果我错了,请告诉我。
我用 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>
我尝试通过谷歌搜索来寻找答案,但运气不太好,这就是为什么我认为我可能走错了方向(?)
听起来你只需要:
receipt.Root.Add(enternode);
换句话说,将新元素添加到文档的根元素。
使用 LINQ 可能有更简单的方法来完成所有这些,顺便说一下。我怀疑你想要这样的东西:
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))
)
);
这将替换您的整个代码。
只需将财政项目添加为财政收据的子项:
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 . . .
考虑到 FiscalReceipt 是根,FiscalItem 是您在其中的元素,您可以做的是尝试方法
root.Add(childElement);
这会将每个 FiscalItem 添加为 FiscalReceipt 的子项。
MSDN link 相同: https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.add%28v=vs.110%29.aspx