【问题标题】:Quotes Issue when Reading from XML File in JAVA从 JAVA 中读取 XML 文件时的引用问题
【发布时间】:2012-09-02 22:37:28
【问题描述】:

我正在尝试从 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();
}

【问题讨论】:

    标签: java xml-parsing sax


    【解决方案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();
        ....
        }
    }
    

    【讨论】:

    • 该代码在读取 XML 文件时完美运行。处理报价时除外。我用许多 XML 文件对其进行了测试,结果符合预期。该错误仅在 XML 标记中的段落包含引号时显示。这意味着我在代码中跟踪 XML 文件中的字符的部分,我应该考虑正确阅读引号。
    • 您确认characters() 没有被调用两次吗?说“它适用于除引号之外的所有内容”并不能证明任何事情。更新后的代码看起来的方式,如果您有两个相邻的调用,您将丢弃第一个节点中的文本并获取第二个。在general 中,必须编写characters() 方法以允许解析器在相邻文本节点的一行中多次调用它。你的不这样做。
    • XML 解析器可以任意分割文本节点。如果您使用的 XML 解析器在看到双引号时选择拆分文本节点,那么它将完全按照您描述的方式运行。
    • 谢谢大家,StringBuilder 是解决方案,因为我相信 String 不处理引号。
    • 不,这与它无关。当您的代码连续收到两个文本节点中的第二个(一个包含带引号的字符串,一个包含其余部分)时,它将第一个替换为第二个。我对 StringBuilder 的使用允许它将两个文本节点累积到一个字符串中。这与引号无关。
    【解决方案2】:

    有趣的是,我模拟了您的情况,我的 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"?>
    

    你呢?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    相关资源
    最近更新 更多