当前位置: 首页 > 知识库问答 >
问题:

从CSV到Java中的XML

邢寒
2023-03-14

这是我想做的,

这是我的spend.csv文件:

"Date","Description","Detail","Amount"
"5/03/21","Cinema","Batman","7.90"
"15/02/20","Groceries","Potatoes","23.00"
"9/12/21","DIY","Wood Plates","33.99"
"9/07/22","Fuel","Shell","$56.00"
"23/08/19","Lamborghini","Aventador","800,000.00"

从表视图:

csv的表格视图

这是我想要的输出文件,名为spend.xml:

 <?xml version="1.0" encoding="UTF-8"?>
    <SPEND>
    <RECORD DATE="5/03/21">
        <DESC>Cinema</DESC>
        <DETAIL>Batman</DETAIL>
        <AMOUNT>7.90</AMOUNT>
    </RECORD>
    <RECORD DATE="15/02/20">
        <DESC>Groceries</DESC>
        <DETAIL>Potatoes</DETAIL>
        <AMOUNT>23.00</AMOUNT>
    </RECORD>
    <RECORD DATE="9/12/21">
        <DESC>DIY</DESC>
        <DETAIL>Wood Plates</DETAIL>
        <AMOUNT>33.99</AMOUNT>
    </RECORD>
    <RECORD DATE="9/07/22">
        <DESC>Fuel</DESC>
        <DETAIL>Shell</DETAIL>
        <AMOUNT>$56.00</AMOUNT>
    </RECORD>
    <RECORD DATE="23/08/19">
        <DESC>Lamborghini</DESC>
        <DETAIL>Aventador</DETAIL>
        <AMOUNT>800,000.00</AMOUNT>
    </RECORD>
    </SPEND>

为了做到这一点,我在这里和那里找到了一些东西,并设法得到了这个:

    public class Main {
    
       public static void main(String[] args) throws FileNotFoundException {
         
            List<String> headers = new ArrayList<String>(5);
    
            File file = new File("spend.csv");
            BufferedReader reader = null;
    
            try {
    
                DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
    
                Document newDoc = domBuilder.newDocument();
                // Root element
                Element rootElement = newDoc.createElement("XMLCreators");
                newDoc.appendChild(rootElement);
    
                reader = new BufferedReader(new FileReader(file));
                int line = 0;
    
                String text = null;
                while ((text = reader.readLine()) != null) {
    
                    StringTokenizer st = new StringTokenizer(text, "", false);
    
                    int index = 0;
    
    
                    String[] rowValues = text.split(",");
    
                    if (line == 0) { // Header row
                        for (String col : rowValues) {
                            headers.add(col);
                        }
                    } else { // Data row
                        Element rowElement = newDoc.createElement("RECORDS");
                        rootElement.appendChild(rowElement);
                        for (int col = 0; col < headers.size(); col++) {
                            String header = headers.get(col);
                            String value = null;
    
                            if (col < rowValues.length) {
                                value = rowValues[col];
                            } else {
                                value = "";
                            }
    
                            Element curElement = newDoc.createElement(header);
                            curElement.appendChild(newDoc.createTextNode(value));
                            rowElement.appendChild(curElement);
                        }
                    }
                    line++;
                }
    
                ByteArrayOutputStream baos = null;
                OutputStreamWriter osw = null;
    
                try {
                    baos = new ByteArrayOutputStream();
                    osw = new OutputStreamWriter(baos);
    
                    TransformerFactory tranFactory = TransformerFactory.newInstance();
                    Transformer aTransformer = tranFactory.newTransformer();
                    aTransformer.setOutputProperty(OutputKeys.INDENT, "yes");
                    aTransformer.setOutputProperty(OutputKeys.METHOD, "xml");
                    aTransformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
    
                    Source src = new DOMSource(newDoc);
                    Result result = new StreamResult(osw);
                    aTransformer.transform(src, result);
    
                    osw.flush();
                    System.out.println(new String(baos.toByteArray()));
                } catch (Exception exp) {
                    exp.printStackTrace();
                } finally {
                    try {
                        osw.close();
                    } catch (Exception e) {
                    }
                    try {
                        baos.close();
                    } catch (Exception e) {
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    }

此时,程序应该在终端中打印XML文件,但是;

遗憾的是,由于我的CSV文件中每个值都有双引号,我遇到了这个问题:

java组织。w3c。多姆。DOMEException invalid_character_err指定了无效或非法的xml字符

我想我在这些方面遗漏了一些东西:


    StringTokenizer st = new StringTokenizer(text, "", false);
    int index = 0;
    String[] rowValues = text.split(",");

我想在我的CSV中保留双引号,如果有人有想法,请随时告诉我!

共有1个答案

钮出野
2023-03-14

在运行转换之前,请执行以下操作:

String.replaceAll("\"", "####")

然后运行转换,当它完成时,将其反转并用双引号替换字符串中的所有 "####"

 类似资料:
  • 问题内容: 我从这里获得了XSLT:http : //andrewjwelch.com/code/xslt/csv/csv-to- xml_v2.html 并将CSV文件转换为XML文档。在命令行上与以下命令一起使用时,它将执行此操作: java -jar saxon9he.jar -xsl:csv-to-xml.csv -it:main -o:output.xml 现在,问题变成了: 如何在Ja

  • 主要是从这个问题:XSLT:CSV(或平面文件,或纯文本)到XML 我这里有一个XSLT:http://andrewjwelch.com/code/xslt/csv/csv-to-xml_v2.html 它将CSV文件转换为XML文档。当与命令行上的以下命令一起使用时,它会这样做: java-jar saxon9he。jar-xsl:csv到xml。csv-it:main-o:output。xml

  • 问题内容: 我有一个 MySQL 表: 还有一个带有以下列的 CSV 文件: 在MySQL表中,所有行的列均为空白,当前数据存在于CSV中。 我想将CSV文件中的列导入到MySQL表中,以匹配行。 我怎样才能做到这一点? 问题答案: 感谢您为我指明正确的方向:花式裤子。 我最终像这样解决了它: 在数据库中创建了一个新表,该表使用CSV中的列进行调用。 使用phpMyAdmin将LOAD DATA导

  • 问题内容: 我正在尝试根据我已经拥有的csv检查提取数据的值。它只会循环遍历CSV的行一次,我只能检查feed.items()的一个值。我需要在某个地方重置值吗?有没有更好/更有效的方法来做到这一点?谢谢。 问题答案: 您可以通过重置文件对象的读取位置来“重置” CSV迭代器。

  • 我试图从csvfile中编写两个txt文件(Test_8.txt和Test_9.txt)。从COL4行我得到单引号和双引号以及“[”。 我怎样才能摆脱他们?

  • 问题内容: 我尝试在Java中删除csv文件中的列。 例如,我有这个csv文件 我想要下一个操作后:(删除csvFile,2)将是: 我发现只有调用行而不是列的操作。 问题答案: 删除CSV文件中一列的唯一方法是删除整个文件(即文件的每一行)的标题和该列的信息。即使您使用第三方库,它也会在内部进行。