有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

拆分文件时出错。使用Java8的xml文件

好的,我对编码是新手,一直在尝试让这个java代码实现我想要的功能,但到目前为止,我在尝试让它正常工作时遇到了问题

据我所知,这部分代码是:

if (str.contains("<TABLE")) {
    tableName = str.split("\'")[1];
}

代码因以下错误而中断:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at decompose.FileDecompose.main(FileDecompose.java:30)

我尝试将[1]更改为[0],但出现以下错误:

java.io.FileNotFoundException: e:\Games\libconfig_twn\decompose\    <TABLE name='KeyInfo' RowCount='77' TableInfoID = '17' FieldCnt = '4'>.xml (The filename, directory name, or volume label syntax is incorrect)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileWriter.<init>(Unknown Source)
    at decompose.FileDecompose.main(FileDecompose.java:33)

我正在使用Java8 up 161

package decompose;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileDecompose {

    public static void main(String[] args) {
        try {
            StringBuffer sb = new StringBuffer("");

            // here goes decrypted libconfig file
            FileReader reader = new FileReader("I:\\libconfig\\merge\\libconfig.xml");

            BufferedReader br = new BufferedReader(reader);
            String str = null;
            int count = 0;
            String tableName = "";
            while ((str = br.readLine()) != null) {
                if (!str.equals("<?xml version=\"1.0\" encoding=\"utf-8\"?>") && !str.contains("<INI TableCount")) {
                    sb.append(str + "\n");
                    if (str.contains("<TABLE")) {
                        tableName = str.split("\'")[1];
                    }
                    if (str.contains("</TABLE>")) {
                        FileWriter writer = new FileWriter(
                        // here goes decomposed files folder
                        "I:\\libconfig\\decompose\\"+ tableName + ".xml");

                        BufferedWriter bw = new BufferedWriter(writer);
                        bw.write(sb.toString());
                        bw.close();
                        writer.close();
                        sb = new StringBuffer("");
                    }
                }
            }

            br.close();
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

我一直在试图分裂我的家庭。xml文档,但到目前为止,无论我对上面的脚本做了什么修改,它都无法工作,因此我请求一些帮助

这里是关于我的xml文档libconfig的一些信息。XML110MB,下面是一个xml文档缩减的示例

<?xml version="1.0" encoding="utf-8"?>
<INI TableCount = '7786' TableInfoCount = '1262'>
<TABLE name='KeyInfo' RowCount='77' TableInfoID = '17' FieldCnt = '4'>
<FIELDINFO Name='Name' IsKey='1' DataType='String'></FIELDINFO>
<FIELDINFO Name='EnumName' IsKey='0' DataType='Enum'></FIELDINFO>
<FIELDINFO Name='InputKind' IsKey='0' DataType='Enum'></FIELDINFO>
<FIELDINFO Name='Modifyer' IsKey='0' DataType='Enum'></FIELDINFO>
<ROW>
<Name><![CDATA[Action]]></Name>
<EnumName>1</EnumName>
<InputKind>216</InputKind>
<Modifyer>0</Modifyer>
</ROW>
</TABLE>
<TABLE name='CharacterInfo' RowCount='2402' TableInfoID = '18' FieldCnt = '16'>
<FIELDINFO Name='ID' IsKey='1' DataType='Enum'></FIELDINFO>
<FIELDINFO Name='CommonName' IsKey='0' DataType='String'></FIELDINFO>
<FIELDINFO Name='CommonName_Eng' IsKey='0' DataType='String'></FIELDINFO>
<FIELDINFO Name='FileName' IsKey='0' DataType='String'></FIELDINFO>
<FIELDINFO Name='PartName' IsKey='0' DataType='String'></FIELDINFO>
<FIELDINFO Name='IllustName' IsKey='0' DataType='String'></FIELDINFO>
<FIELDINFO Name='WalkSpeed' IsKey='0' DataType='float'></FIELDINFO>
<FIELDINFO Name='SizeOnStop' IsKey='0' DataType='Enum'></FIELDINFO>
<FIELDINFO Name='SizeOnMove' IsKey='0' DataType='Enum'></FIELDINFO>
<FIELDINFO Name='RunSpeed' IsKey='0' DataType='float'></FIELDINFO>
<FIELDINFO Name='MinAtkRange' IsKey='0' DataType='INT'></FIELDINFO>
<FIELDINFO Name='MaxAtkRange' IsKey='0' DataType='INT'></FIELDINFO>
<FIELDINFO Name='ChaseRange' IsKey='0' DataType='INT'></FIELDINFO>
<FIELDINFO Name='PivotFileName' IsKey='0' DataType='String'></FIELDINFO>
<FIELDINFO Name='TransRate' IsKey='0' DataType='INT'></FIELDINFO>
<FIELDINFO Name='HideShadow' IsKey='0' DataType='bool'></FIELDINFO>
<ROW>
<ID>1</ID>
<CommonName><![CDATA[Rabbit]]></CommonName>
<CommonName_Eng><![CDATA[Rabbit]]></CommonName_Eng>
<FileName><![CDATA[data\character\chr001.nri]]></FileName>
<PartName><![CDATA[data\part\chr001_]]></PartName>
<IllustName><![CDATA[ ]]></IllustName>
<WalkSpeed>0.000000</WalkSpeed>
<SizeOnStop>2</SizeOnStop>
<SizeOnMove>0</SizeOnMove>
<RunSpeed>0.000000</RunSpeed>
<MinAtkRange>50</MinAtkRange>
<MaxAtkRange>70</MaxAtkRange>
<ChaseRange>300</ChaseRange>
<PivotFileName><![CDATA[data\character\chr001.pvt]]></PivotFileName>
<TransRate>0</TransRate>
<HideShadow>0</HideShadow>
</ROW>
</TABLE>
</INI>

好的,我想从<TABLE to </TABLE>分割我的xml,然后搜索name=“?”在<TABLE name='KeyInfo' RowCount='77' TableInfoID = '17' FieldCnt = '4'>中创建一个文件示例: 00001_KeyInfo。xml

00002_CharacterInfo。xml

等等

大约有11000个表需要拆分,每个表都有不同的内容,需要utf-8字符编码,所以是的,这对我来说太难了,因为我是一个新的编码者,我希望有人能提供帮助


共 (2) 个答案

  1. # 1 楼答案

    我不知道为什么会失败,但这是一个可怕的方式来处理这项任务。永远不要在XML上使用字符串匹配,始终使用正确的XML解析器

    在XSLT 2.0中,这项工作非常简单:

    <xsl:template match="TABLE">
      <xsl:result-document href="{@name}.xml">
        <xsl:copy-of select="."/>
      </xsl:result-document>
    </xsl:template>
    
  2. # 2 楼答案

    您可以像这样使用JavaXMLAPI

    public static void main(String... args) throws Exception {
    
        String file = "/home/william/Documents/test.xml";
        FileInputStream fis = new FileInputStream(new File(file));
        Document xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(fis);
        XPath xpath = XPathFactory.newInstance().newXPath();
        String expression = "//TABLE";
        NodeList nodeList = (NodeList) xpath.compile(expression).evaluate(xml, XPathConstants.NODESET);
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node table = nodeList.item(i);
            String name = table.getAttributes().getNamedItem("name").getTextContent();
            String content = toContent(table);
            save(content, name);
        }
    }
    
    private static String toContent(Node node) {
        // your implementation here
        return null;
    }
    
    private static void save(String content, String name) {
        // TODO implement
    }