【问题标题】:Manipulate String to XML using Java使用 Java 将字符串操作为 XML
【发布时间】:2019-07-16 09:06:35
【问题描述】:

我从 PDF 中提取了如下字符串格式的数据。(请注意不均匀的间距和换行符)。

 Virtual Salary                                 25,100.00   EIS EE Contr.                                       7.90
 Virtual Car Allowance                           1,600.00   EPF Employee Contr.                             2,937.00
 Payment Received(Oversea)                       4,265.01   SOCSO Employee Contr.                              19.75

如何将此字符串转换为如下所示的 XML。

public void testMethod()
    {
        String extractedTestFromPDF=
                 " Virtual Salary                                 25,100.00   EIS EE Contr.                                       7.90\n"+
                 "\t Virtual Car Allowance                           1,600.00   EPF Employee Contr.                             2,937.00\n"+
                 " Payment Received(Oversea)                       4,265.01   SOCSO Employee Contr.                              19.75\n";

    }

需要 XML:

<xml>
<Data>
    <Allowance>Virtual Salary</Allowance>
    <Allowance_Amount>25,100.00</Allowance_Amount>
</Data>
<Data>
    <Allowance>EIS EE Contr.</Allowance>
    <Allowance_Amount>7.90</Allowance_Amount>
</Data>
<Data>
    <Allowance>Virtual Car Allowance</Allowance>
    <Allowance_Amount>1,600.00</Allowance_Amount>
</Data>
...
</xml>

【问题讨论】:

    标签: java xml string


    【解决方案1】:
    String fixedSizetoXML(String extractedTestFromPDF) {
        String[] lines = extractedTestFromPDF.split("\\R");
        Pattern pattern = Pattern.compile("^\\s*(\\S.{20})\\s\\s+([-\\d,\\.]+)\\s+.*$");
        //                                      (--------)       (-----------)
        return "<?xml verion="1.0">\n<Xml>\n"
            + Stream.of(lines)
                  .map(pattern::matcher)
                  .filter(m::find)
                  .map(m -> String.format("<Data>\n"
                                + "    <Allowance>%s</Allowance>\n"
                                + "    <Allowance_Amount>%s</Allowance_Amount>\n"
                                + "</Data>\n",
                                m.group(1).trim(), m.group(2)))
    
                  .collect(Collectors.joining(""))
            + "<Xml>\n";
    }
    

    我冒昧地添加了一个 XML 预处理指令 &lt;?xml ...&gt; 并为清楚起见将 xml 更改为 Xml

    这些是具有固定长度字段的记录。计数位置并不完全安全, 看到一个制表符字符 \t 并考虑特殊字符:é 可能是一个字符,但也可能是 e 加上一个特殊的零宽度 ´,我改用正则表达式模式。金额前至少需要两个空格字符。


    Java 7

    String fixedSizetoXML(String extractedTestFromPDF) {
        String[] lines = extractedTestFromPDF.split("\\R");
        Pattern pattern = Pattern.compile("^\\s*(\\S.{20})\\s\\s+([-\\d,\\.]+)\\s+.*$");
        //                                      (--------)       (-----------)
        StringBuilder sb = new StringBuilder(lines.length * 64);
        sb.append("<?xml verion="1.0">\n<Xml>\n");
        for (String line : lines) {
            Matcher m = pattern.matcher(line);
            if (m.find()) {
                String data = String.format("<Data>\n"
                                + "    <Allowance>%s</Allowance>\n"
                                + "    <Allowance_Amount>%s</Allowance_Amount>\n"
                                + "</Data>\n",
                                m.group(1).trim(), m.group(2));
                sb.append(data);
            }
        }
        sb.append("<Xml>\n");
        return sb.toString();
    }
    

    【讨论】:

    • 谢谢埃根。感谢您是否可以在 java 7 中发布上述方法,因为我们仍然使用旧版本。对不起,我没有提到。
    猜你喜欢
    • 2011-10-04
    • 2013-10-17
    • 2015-03-08
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2023-04-06
    相关资源
    最近更新 更多