1

XML から読み取り、データをテキスト ファイルに保存しようとしています。私のコードは、XML ファイルの段落に二重引用符が含まれている場合を除き、データの読み取りと保存に非常に適しています。

例えば:

    <Agent> "The famous spy" James Bond </Agent>

出力は引用符付きのデータを無視し、結果は次のようになります: James Bond

私は SAX を使用していますが、問題がある可能性のあるコードの一部を以下に示します。

 public void characters(char[] ch, int start, int length) throws SAXException 
  { 
        tempVal = new String(ch, start, length); 
  }

文字列を tempVal に格納する前に、引用符を置き換える必要があると思います。

何か案は???

念のため、完全なコードを次に示します。

パブリック クラス含意 {

  private String Text;

  private String Hypothesis;

  private String ID;

  private String Entailment;

}

//Event Handlers
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    //reset
    tempVal = "";
    if(qName.equalsIgnoreCase("pair")) {
        //create a new instance of Entailment
        tempEntailment = new Entailment();
        tempEntailment.setID(attributes.getValue("id"));
        tempEntailment.setEntailment(attributes.getValue("entailment"));
    }
}

public void characters(char[] ch, int start, int length) throws SAXException {
    tempVal = new String(ch, start, length);
}

public void endElement(String uri, String localName, String qName) throws SAXException {
    if(qName.equalsIgnoreCase("pair")) {
        //add it to the list
        Entailments.add(tempEntailment);
    }else if (qName.equalsIgnoreCase("t")) {
        tempEntailment.setText(tempVal);
    }else if (qName.equalsIgnoreCase("h")) {
        tempEntailment.setHypothesis(tempVal);
    }
}

public static void main(String[] args){
    XMLtoTXT spe = new XMLtoTXT();
    spe.runExample();
}
4

2 に答える 2

1

パーサーcharacters()が入力を複数の隣接するテキスト ノードとして扱っているため、メソッドが複数回呼び出されています。あなたのコードが書かれている方法(あなたが示していない)は、おそらく最後のテキストノードだけを保持しています。

隣接するテキスト ノードのコンテンツを自分で蓄積する必要があります。

StringBuilder tempVal = null;

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    //reset
    tempVal = new StringBuilder();
    ....
}

public void characters(char[] ch, int start, int length) throws SAXException {
    tempVal.append(ch, start, length);
}

public void endElement(String uri, String localName, String qName) throws SAXException {
    String textValue = tempVal.toString();
    ....
    }
}
于 2012-09-10T04:25:20.973 に答える
0

興味深いことに、あなたの状況をシミュレートしたところ、SAX パーサーは正常に動作しました。私はjdk 1.6.0_20を使用しています。これがパーサーの作成方法です。

  // Obtain a new instance of a SAXParserFactory.
  SAXParserFactory factory = SAXParserFactory.newInstance();
  // Specifies that the parser produced by this code will provide support for XML namespaces.
  factory.setNamespaceAware(true);
  // Specifies that the parser produced by this code will validate documents as they are parsed.
  factory.setValidating(true);
  // Creates a new instance of a SAXParser using the currently configured factory parameters.
  saxParser = factory.newSAXParser();

私のXMLヘッダーは次のとおりです。

<?xml version="1.0" encoding="iso-8859-1"?>

あなたはどうですか?

于 2012-09-10T05:23:14.100 に答える