1

我正在尝试从 XML 中读取数据并将数据存储在文本文件中。我的代码在读取和存储数据方面效果很好,除非 XML 文件中的段落包含双引号。

例如:

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

输出将忽略任何带引号的数据,结果将是:詹姆斯邦德

我正在使用 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 回答