将带有多列的制表符分隔文本文件转换为XML

时间:2018-01-29 15:13:51

标签: java c# xml

我正在尝试以编程方式将包含多列信息的文本文件转换为具有以下格式的XML文件:

<ExampleDataSet>
<Example ExID="AA" exampleCode="AA" exampleDescription="THIS IS AN EXAMPLE DESCRIPTION"/>
<Example ExID="BB" exampleCode="BB" exampleDescription="THIS IS AN EXAMPLE DESCRIPTION"/>
<Example ExID="CC" exampleCode="CCC" exampleDescription="THIS IS AN EXAMPLE DESCRIPTION"/>
<Example ExID="DDD" exampleCode="DD" exampleDescription="THIS IS AN EXAMPLE DESCRIPTION"/>
<Example ExID="EEEE" exampleCode="EE" exampleDescription="THIS IS AN EXAMPLE DESCRIPTION"/>
</ExampleDataSet>

我发现了其他类似转换的示例,但更简单。有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:0)

我会编写SQL代码来执行此操作,但几乎可以使用任何编程工具完成。读写记录是程序员的基本工作之一。

答案 1 :(得分:0)

您可以使用以下方法手动创建XML文档。此示例创建一个包含1个元素和所需属性的XML文档。

首先,创建xml文档本身并附加顶级元素集合标题。

            XmlDocument doc = new XmlDocument();
            XmlNode node = doc.CreateElement("ExampleDataSet");
            doc.AppendChild(node);

现在创建一个新的元素行。 (你需要一个循环,每个csv行1个!)

            XmlNode eg1 = doc.CreateElement("Example");

然后创建元素的每个属性并追加。

            XmlAttribute att1 = doc.CreateAttribute("ExID");
            att1.Value = "AA";

            XmlAttribute att2 = doc.CreateAttribute("exampleCode");
            att2.Value = "AA";

            XmlAttribute att3 = doc.CreateAttribute("exampleDescription");
            att3.Value = "THIS IS AN EXAMPLE DESCRIPTION";

            eg1.Attributes.Append(att3);
            eg1.Attributes.Append(att2);
            eg1.Attributes.Append(att1);

最后,追加到父节点。

            node.AppendChild(eg1);

如果需要,可以像这样获取XML字符串。

            string xml = doc.OuterXml;

或者您可以将其直接保存到文件中。

            doc.Save("C:\\test.xml");

希望能帮到你的路上。 感谢

答案 2 :(得分:0)

在XSLT 3.0中,您可以将其编写为,例如:

<xsl:variable name="columns" select="'exId', 'exCode', 'exDesc'"/>

<xsl:template name="xsl:initial-template">
  <DatasSet>
    <xsl:for-each select="unparsed-text-lines('input.csv')">
      <xsl:variable name="tokens" select="tokenize(., '\t')"/>
      <Example>
        <xsl:for-each select="1 to count($tokens)">
          <xsl:attribute name="{$columns[$i]}" select="$tokens[$i]"/>
        </xsl:for-each>
      </Example>
    </xsl:for-each>
  </DataSet>
</xsl:template>

我不确定你为什么要标记“Java”和“C#”这个问题,但你可以使用从Java或C#或命令行调用的Saxon-HE来运行它。

答案 3 :(得分:0)

使用xml linq并假设文件的第一行是列标题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            XDocument doc = new XDocument();
            doc.Add(new XElement("ExampleDataSet"));

            XElement root = doc.Root;

            StreamReader reader = new StreamReader(FILENAME);
            int rowCount = 1;
            string line = "";
            string[] headers = null;
            while((line = reader.ReadLine()) != null)
            {
                if (rowCount++ == 1)
                {
                    headers = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                }
                else
                {
                    string[] arrayStr = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    XElement newRow = new XElement("Example");
                    root.Add(newRow);
                    for (int i = 0; i < arrayStr.Count(); i++)
                    {
                        newRow.Add(new XAttribute(headers[i], arrayStr[i]));
                    }

                }
            }

        }
    }
}