C# 使用C将XML文件转换为XML扁平化#

C# 使用C将XML文件转换为XML扁平化#,c#,.net,xml,C#,.net,Xml,我需要转换XML文件,使其在Excel中可读。其思想是将XML文件展平。此外,我正在使用C#,因为大多数资源都可以帮助我使用我不需要的SQL 任何帮助都可以 资料来源: <root> <product> <screen> Samsung </screen> <screen> Mecer </screen>

我需要转换XML文件,使其在Excel中可读。其思想是将XML文件展平。此外,我正在使用C#,因为大多数资源都可以帮助我使用我不需要的SQL

任何帮助都可以

资料来源:

<root>
    <product>
        <screen>
            Samsung
        </screen>
        <screen>
            Mecer
        </screen>
    </product>
    <product>       
        <phone>
            Sony
        </phone>
        <phone>
            Nokia
        </phone>
    </product>
</root>

三星
华荣汇
索尼
诺基亚
预期结果

<dataSet>
    <row>
        <column>
            screen
        </column>
        <column>
            phone
        </column>
    </row>
    <row>
        <column>
            Samsung
        </column>
        <column>
            Sony
        </column>
    </row>
    <row>
        <column>
            Mecer
        </column>
        <column>
            Nokia
        </column>
    </row>
</dataSet>

屏幕
电话
三星
索尼
华荣汇
诺基亚

更好的方法是创建类的新结构:

[Serializable]
[XmlRoot(ElementName = "dataSet")]
public class RootDataSet
{
    [XmlElement(ElementName = "row")]
   public  List<Rows> Rows { get; set; }
}

[Serializable]
public class Rows
{
    [XmlElement(ElementName = "column")]
    public List<string> column { get; set; }
}
[可序列化]
[XmlRoot(ElementName=“数据集”)]
公共类根数据集
{
[XmlElement(ElementName=“行”)]
公共列表行{get;set;}
}
[可序列化]
公共类行
{
[xmlement(ElementName=“column”)]
公共列表列{get;set;}
}
在您确定之后,您可以将此代码放入一个方法中以生成文件

    static void Main(string[] args)
    {
        using (Stream fileStream = new FileStream(@"C:\Nova pasta\file.xml",   FileMode.OpenOrCreate))
        {
            RootDataSet dataset = new RootDataSet();

            dataset.Rows = new List<Rows>();

            Rows Rows1 = new Rows();
            Rows1.column = new List<string>();
            Rows1.column.Add("teste1");
            Rows1.column.Add("teste2");
            dataset.Rows.Add(Rows1);

            //use reflection to get the properties names of the class
            //get the values of the class

            XmlSerializer xmlSerializer = new XmlSerializer(dataset.GetType());
            xmlSerializer.Serialize(fileStream, dataset);

        }

    }
static void Main(字符串[]args)
{
使用(Stream fileStream=new fileStream(@“C:\Nova-pasta\file.xml”,FileMode.OpenOrCreate))
{
RootDataSet数据集=新的RootDataSet();
dataset.Rows=新列表();
行1=新行();
Rows1.column=新列表();
第1行。第1列。添加(“测试1”);
第1行。第1列。添加(“第2行”);
dataset.Rows.Add(第1行);
//使用反射获取类的属性名称
//获取类的值
XmlSerializer XmlSerializer=新的XmlSerializer(dataset.GetType());
序列化(文件流,数据集);
}
}
返回的文件将是:

<?xml version="1.0"?>
<dataSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <row>
    <column>teste1</column>
    <column>teste2</column>
  </row>
</dataSet>

测试1
测试2

正如@June Paik所提到的,您可以使用XSLT

因为这将允许您配置如何转换XML,而无需每次重新编译应用程序(您只需修改XSLT并再次运行应用程序)

以下是XSLT的起点:

  <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
        <xsl:apply-templates select="*"/>
      </xsl:template>
      <xsl:template match="node( ) | @*">
        <xsl:copy><xsl:apply-templates select="@* | node( )"/></xsl:copy>
      </xsl:template>
      <!-- Name of the element you wish to find here-->
      <xsl:template match="Product">
        <!-- What you want to change it to here -->
        <Row><xsl:apply-templates select="@* | node( )"/></Row>
      </xsl:template>
    </xsl:stylesheet>

要从
源代码
预期结果
,您可以尝试…您尝试了什么?你有什么代码吗?你的问题有点模糊,但是如果你想把一个XML转换成另一个XML,你可以看看XslCompiledTransform(),它可以使用你想要的标记将XML表转换成几种不同的输出格式。如果这不是您的选项,您可能必须创建一个映射器类并自己映射所有标记。
XslCompiledTransform Trans = new XslCompiledTransform();
Trans.Load(@"C:\productTransform.xslt");
Trans.Transform("products.xml", "transformedProducts.xml");