1

私はJAVAが初めてで、テキストファイルを読み込んでXMLに書きたいと思っています。ここに私の入力があります:

  1. R.-J. Roe,J.Appl.Phys.36、2024(1965)。

および出力ですが、次のとおりです。

        <ref id="1">
        <label>1</label>
        <citation-alternatives>
            <mixed-citation>R.-J. Roe, J. Appl.Phys. 36, 2024 (1965).</mixed-citation>
        </citation-alternatives>
    </ref>

多くの場合、この入力は次のようにスペースなしで 2 行に渡されます。

  1. R.-J. 卵、

    J.Appl.Phys.36、2024(1965)。

出力は次のようになります。

        <ref id="1">
        <label>1</label>
        <citation-alternatives>
            <mixed-citation>R.-J. Roe, </mixed-citation>
        </citation-alternatives>
    </ref>

    <ref id="1">
        <label>1</label>
        <citation-alternatives>
            <mixed-citation>J. Appl.Phys. 36, 2024 (1965).</mixed-citation>
        </citation-alternatives>
    </ref>

今私の質問は、最初の出力のようになるために、この 2 行を 1 つの攪拌としてどのように読み取ることができるかということです。ここに私のコードがあります:

try {
            String strLine;
            String num="";
            String mix="";
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

            // Back element
            Document doc = docBuilder.newDocument();
            Element rootElement = doc.createElement("Back");
            doc.appendChild(rootElement);

            // ref-list element
            Element reflist = doc.createElement("ref-list");
            rootElement.appendChild(reflist);

            while( (strLine = br.readLine()) != null)                   
                
            {                       
                if (strLine.equals("")) {
                    continue;
                }
                int dotIndex = strLine.indexOf(".");

                num = strLine.substring(0,dotIndex);
                mix = strLine.substring(dotIndex+2,strLine.length());



                // ref element
                Element ref= doc.createElement("ref");
                reflist.appendChild(ref);

                // set attribute of ref element
                Attr attr = doc.createAttribute("id");
                attr.setValue(num);
                ref.setAttributeNode(attr);

                // label element
                Element label = doc.createElement("label");
                ref.appendChild(label);
                label.setTextContent(num);

                // citation-alternatives element
                Element citationalternatives = doc.createElement("citation-alternatives");
                ref.appendChild(citationalternatives);

                // mixed-citation element
                Element mixedcitation = doc.createElement("mixed-citation");
                citationalternatives.appendChild(mixedcitation);
                mixedcitation.setTextContent(mix);
            }
4

2 に答える 2

1

strLineを要素に挿入する前に、strLine.endsWith( "、")があるかどうかを確認します。挿入する場合は、次の行(など)を読み取り、最初のstrLineに追加します。

于 2013-03-23T13:15:05.467 に答える
0

コードが<ref>余分な改行を含むレコードを読み取るときに 2 つのレコードを作成する理由は、改行を使用してレコードの開始時期を定義しているためです。

レコードの開始をマークするものを明確に定義する必要があります。

たとえば、すべてのレコードが数字で始まり、その後にピリオドが続く場合があります。多分それはもっと予測可能です: それらはすべて連番で始まり、その後にピリオドが続きます。このロジックを利用して、新しい要素の作成を条件付きで移動できます。

    Element ref= doc.createElement("ref");
    while( (strLine = br.readLine()) != null) {                       
        if (strLine.equals(""))
            continue;
        int dotIndex = strLine.indexOf(".");
        num = strLine.substring(0,dotIndex);
        mix = strLine.substring(dotIndex+2,strLine.length());
        if(refStart(strLine)) {
            ref= doc.createElement("ref");
            reflist.appendChild(ref);
        }
        //now decide how to parse the input - maybe it will be different depending on 
        //whether the line we just read starts a new record or continues one from
        //the previous line.
    }


    public boolean refStart(String line) {
        if(line.length()<2) 
            return false;
        int dotIndex = strLine.indexOf(".");
        if(dotIndex<=0 || dotIndex>5) //assuming largest value is 99999
            return false;
        String numString = strLine.substring(0,dotIndex);
        for(int i=0; i<numString.length(); i++) {
            if(!Character.isDigit(numString.charAt(i) )
               return false;
        }
        return true;
    }
于 2013-03-23T13:28:32.533 に答える