0

我需要转换一个 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>
4

2 回答 2

1

正如@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>

XSLT 将名为“Product”的元素更改为“Row”

将此保存到 C:\ 上的文件(例如 productTransform.xslt)中

然后通过编写以下 3 行在 C# 中使用 XSLT:

XslCompiledTransform Trans = new XslCompiledTransform();
Trans.Load(@"C:\productTransform.xslt");
Trans.Transform("products.xml", "transformedProducts.xml");
于 2013-07-02T13:31:02.613 回答
1

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

[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; }
}

在你知道后,你可以把这个代码放入一个方法来生成文件。

    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);

        }

    }

返回的文件将是:

<?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>
于 2013-07-02T11:52:47.433 回答