C# 使用C将XML转换为CSV#

C# 使用C将XML转换为CSV#,c#,.net,linq-to-xml,xmlreader,C#,.net,Linq To Xml,Xmlreader,如何在C#中将XML文件转换为CSV文件,仅显示以下标记:, 示例XML代码:它表示多行中的一行,每行可能包含多个标记 <?xml version="1.0" encoding="UTF-8"?> <impots xmlns="http://www.google.com/xml/impot//20016-02-31"> <impot impot-no="W0110891258"> <impot-date>2017-12-10T22:33

如何在C#中将XML文件转换为CSV文件,仅显示以下标记:

示例XML代码:它表示多行中的一行,每行可能包含多个
标记

<?xml version="1.0" encoding="UTF-8"?>
<impots xmlns="http://www.google.com/xml/impot//20016-02-31">
  <impot impot-no="W0110891258">
    <impot-date>2017-12-10T22:33:35.000Z</impot-date>
    <prop-by>Yallo</prop-by>
    <original-impot-no>891258</original-impot-no>
    <currency>EUR</currency>
    <server-locale>Esp</server-locale>
    <lax>gross</lax>
    <current-impot-no>123358</current-impot-no>
    <product-lineitems>
       <product-lineitem>
            <price>450</price>
            <red>6.50</red>
            <Small-price>39</Small-price>
            <Big-price>3229</Big-price>
            <lineitem-text>Grand create</lineitem-text>
            <basis>234.00</basis>
        </product-lineitem>
    </product-lineitems>
       <product-lineitem>
            <price>432</price>
            <red>12</red>
            <Small-price>44</Small-price>
            <Big-price>34</Big-price>
            <lineitem-text>Small create</lineitem-text>
            <basis>44.00</basis>
       </product-lineitem>
    </product-lineitems>
  </impot>
</impots>

有人能提出一个解决方案吗?非常感谢您。

查看以下代码。请注意使用
SelectMany
获取重要项以构建所需的对象模型

XNamespace ns = "http://www.google.com/xml/impot//20016-02-31";
var results = xDocument.Descendants(ns + "impot")
    .SelectMany(impot => impot.Descendants(impot.Name.Namespace + "product-lineitem")
        .Select(item => new {
            ImpotNo = (string)impot.Element(impot.Name.Namespace + "original-impot-no"),
            Price = (string)item.Element(item.Name.Namespace + "price"),
            SmallPrice = (string)item.Element(item.Name.Namespace + "Small-price"),
            BigPrice = (string)item.Element(item.Name.Namespace + "Big-price"),
        })
    ).ToList();


for (int i = 0; i < results.Count; i++) {
    dataToBeWritten.Append(results[i].ImpotNo);
    dataToBeWritten.Append(";");
    dataToBeWritten.Append(results[i].Price);
    dataToBeWritten.Append(";");
    dataToBeWritten.Append(results[i].SmallPrice);
    dataToBeWritten.Append(";");
    dataToBeWritten.Append(results[i].BigPrice);
    dataToBeWritten.Append(";");
    dataToBeWritten.Append(0);
    dataToBeWritten.Append(Environment.NewLine);
}
xns=”http://www.google.com/xml/impot//20016-02-31";
var results=xDocument.subjects(ns+“import”)
.SelectMany(impot=>impot.substands(impot.Name.Namespace+“product lineitem”)
.选择(项目=>新建){
ImpotNo=(字符串)impot.Element(impot.Name.Namespace+“原始impot no”),
Price=(字符串)item.Element(item.Name.Namespace+“Price”),
SmallPrice=(字符串)item.Element(item.Name.Namespace+“Small price”),
BigPrice=(字符串)item.Element(item.Name.Namespace+“Big price”),
})
).ToList();
for(int i=0;i

还要注意用于属性的语法。

首先,我尝试重新格式化XML,使其更具可读性,但标记结构似乎仍然错误

<impots
    xmlns="http://www.google.com/xml/impot//20016-02-31">
    <impot impot-no="W0110891258">
        <impot-date>2017-12-10T22:33:35.000Z</impot-date>
        <prop-by>Yallo</prop-by>
        <original-impot-no>891258</original-impot-no>
        <currency>EUR</currency>
        <server-locale>Esp</server-locale>
        <lax>gross</lax>
        <current-impot-no>123358</current-impot-no>
        <product-lineitems>
            <product-lineitem>
                <price>450</price>
                <red>6.50</red>
                <Small-price>39.00</Small-price>
                <Big-price>3229.00</Big-price>
                <lineitem-text>Grand create</lineitem-text>
                <basis>234.00</basis>
-
            </product-lineitems>
-
        </product-lineitem>
        <product-lineitems>
            <product-lineitem>
                <price>432</price>
                <red>12</red>
                <Small-price>44.00</Small-price>
                <Big-price>34.00</Big-price>
                <lineitem-text>Small create</lineitem-text>
                <basis>44.00</basis>
            </product-lineitems>
        </product-lineitem>
也许你的意思是

impot-no = (string)x.Attribute("impot-no").Value

使用内存——希望这是检索属性的正确方法。

您的XML无效。我想这是正确的格式

<?xml version="1.0" encoding="UTF-8"?>
<impots xmlns="http://www.google.com/xml/impot//20016-02-31">
   <impot impot-no="W0110891258">
      <impot-date>2017-12-10T22:33:35.000Z</impot-date>
      <prop-by>Yallo</prop-by>
      <original-impot-no>891258</original-impot-no>
      <currency>EUR</currency>
      <server-locale>Esp</server-locale>
      <lax>gross</lax>
      <current-impot-no>123358</current-impot-no>
      <product-lineitems>
         <product-lineitem>
            <price>450</price>
            <red>6.50</red>
            <Small-price>39.00</Small-price>
            <Big-price>3229.00</Big-price>
            <lineitem-text>Grand create</lineitem-text>
            <basis>234.00</basis>
         </product-lineitem>
      </product-lineitems>
      <product-lineitems>
         <product-lineitem>
            <price>432</price>
            <red>12</red>
            <Small-price>44.00</Small-price>
            <Big-price>34.00</Big-price>
            <lineitem-text>Small create</lineitem-text>
            <basis>44.00</basis>
         </product-lineitem>
      </product-lineitems>
   </impot>
</impots>
然后,需要修改查询以检索所需的元素

这是样品。我假设
product lineitems
只有一个子
product lineitem

var results = xDocument.Descendants(ns + "impot").Select(x => new {
    ImpotNo = x.Attribute("impot-no")?.Value,
    ProductLineItems = x.Descendants(ns + "product-lineitems").Select(y => new
    {
        Item = y.Descendants(ns + "product-lineitem").Select(z => new
        {
            Price = z.Element(ns + "price")?.Value,
            SmallPrice = z.Element(ns + "Small-price")?.Value,
            BigPrice = z.Element(ns + "Big-price")?.Value,
        }).FirstOrDefault()
    })
});

foreach (var result in results)
{
    foreach (var productLine in result.ProductLineItems)
    {
        dataToBeWritten.Append(result.ImpotNo);
        dataToBeWritten.Append(";");
        dataToBeWritten.Append(productLine.Item.Price);
        dataToBeWritten.Append(";");
        dataToBeWritten.Append(productLine.Item.SmallPrice);
        dataToBeWritten.Append(";");
        dataToBeWritten.Append(productLine.Item.BigPrice);
        dataToBeWritten.Append(";");
        dataToBeWritten.Append(0);
        dataToBeWritten.Append(Environment.NewLine);
    }
}

谢谢你的回答,问题是我无法获得根目录。我已经添加了你提到的名称空间,但是我得到了一个空白的csv文件。你需要修改你的查询以满足你的需要。我已经编辑了我的帖子。谢谢!它起作用了,但是我有几个子
产品线项目
用于一个重要的否,并且每个
重要的否
都可以复制,这取决于
产品线项目
如果它解决了问题中的主要问题,请接受答案。如果可以有多个
产品行项目,则可以删除
FirstOrDefault()
。然后,您需要在
项上再执行一次循环来构造结果。你需要自己做重复检查。祝你好运。对不起,你能提供答案吗
<?xml version="1.0" encoding="UTF-8"?>
<impots xmlns="http://www.google.com/xml/impot//20016-02-31">
   <impot impot-no="W0110891258">
      <impot-date>2017-12-10T22:33:35.000Z</impot-date>
      <prop-by>Yallo</prop-by>
      <original-impot-no>891258</original-impot-no>
      <currency>EUR</currency>
      <server-locale>Esp</server-locale>
      <lax>gross</lax>
      <current-impot-no>123358</current-impot-no>
      <product-lineitems>
         <product-lineitem>
            <price>450</price>
            <red>6.50</red>
            <Small-price>39.00</Small-price>
            <Big-price>3229.00</Big-price>
            <lineitem-text>Grand create</lineitem-text>
            <basis>234.00</basis>
         </product-lineitem>
      </product-lineitems>
      <product-lineitems>
         <product-lineitem>
            <price>432</price>
            <red>12</red>
            <Small-price>44.00</Small-price>
            <Big-price>34.00</Big-price>
            <lineitem-text>Small create</lineitem-text>
            <basis>44.00</basis>
         </product-lineitem>
      </product-lineitems>
   </impot>
</impots>
XNamespace ns = "http://www.google.com/xml/impot//20016-02-31";
var results = xDocument.Descendants(ns + "impot");
var results = xDocument.Descendants(ns + "impot").Select(x => new {
    ImpotNo = x.Attribute("impot-no")?.Value,
    ProductLineItems = x.Descendants(ns + "product-lineitems").Select(y => new
    {
        Item = y.Descendants(ns + "product-lineitem").Select(z => new
        {
            Price = z.Element(ns + "price")?.Value,
            SmallPrice = z.Element(ns + "Small-price")?.Value,
            BigPrice = z.Element(ns + "Big-price")?.Value,
        }).FirstOrDefault()
    })
});

foreach (var result in results)
{
    foreach (var productLine in result.ProductLineItems)
    {
        dataToBeWritten.Append(result.ImpotNo);
        dataToBeWritten.Append(";");
        dataToBeWritten.Append(productLine.Item.Price);
        dataToBeWritten.Append(";");
        dataToBeWritten.Append(productLine.Item.SmallPrice);
        dataToBeWritten.Append(";");
        dataToBeWritten.Append(productLine.Item.BigPrice);
        dataToBeWritten.Append(";");
        dataToBeWritten.Append(0);
        dataToBeWritten.Append(Environment.NewLine);
    }
}