SAX分析器字符方法不收集所有内容

时间:2015-07-22 16:29:49

标签: java xml sax

我使用SAX解析器来解析XML并且工作正常。

我在XML中有以下标记。

<value>•CERTASS >> Certass</value>

我希望&#39; •CERTASS&gt;&gt; Certass &#39;作为输出。但是下面的代码只返回Certassvalue标签的特殊字符是否存在任何问题?

public void characters(char[] buffer, int start, int length) {
           temp = new String(buffer, start, length);
    }

2 个答案:

答案 0 :(得分:4)

无法保证characters()方法只能在元素内运行一次。

如果要将内容存储在String中,并且characters()方法恰好运行两次,则只会从第二次运行中获取内容。 character方法第二次运行时将覆盖第一次存储的temp变量的内容。

要解决此问题,请使用StringBuilder中的append()characters()内容,然后处理endElement()中的内容。例如:

 DefaultHandler handler = new DefaultHandler() {
     private StringBuilder stringBuilder;

     @Override
     public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
         stringBuilder = new StringBuilder();
     }

     public void characters(char[] buffer, int start, int length) {
         stringBuilder.append(new String(buffer, start, length));
     }

     public void endElement(String uri, String localName, String qName) throws SAXException {
         System.out.println(stringBuilder.toString());
     }
 };

解析String&#34; <value>•CERTASS >> Certass</value>&#34;并且上面的处理程序给出了输出:

?CERTASS >> Certass

我希望这会有所帮助。

答案 1 :(得分:0)

前几天我遇到了这个问题,事实证明原因是如果值中包含以下任何字符,则多次调用CHaracters方法:

"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;

还要注意值内的换行符/换行符!!! 如果xml在没有您的控制的情况下被换行,则还会为该语句中的每一行调用character方法,此外它将返回换行符! (您需要手动依次删除)。

一个处理所有这些问题的示例处理程序是这样的:

 DefaultHandler handler = new DefaultHandler() {
   private boolean isInANameTag = false;
   private String localname;
   private StringBuilder elementContent;

   @Override
   public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
    if (qname.equalsIgnoreCase("myfield")) {
      isInMyTag = true;
      this.localname = localname;
      this.elementContent = new StringBuilder();
    }
   }

   public void characters(char[] buffer, int start, int length) {
      if (isInMyTag) {
         String content = new String(ch, start, length);
         if (StringUtils.equals(content.substring(0, 1), "\n")) {
              // remove leading newline
              elementContent.append(content.substring(1));
         } else {
              elementContent.append(content);
         }
      }
   }

   public void endElement(String uri, String localName, String qName) throws SAXException {
     if (qname.equalsIgnoreCase("myfield")) {
       isInMyTag = false;
       // do something with elementContent.toString());
       System.out.println(elementContent.toString());
       this.localname = "";
     }
   }
}