Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SAX解析器字符方法不';不要收集所有内容_Java_Xml_Sax - Fatal编程技术网

Java SAX解析器字符方法不';不要收集所有内容

Java SAX解析器字符方法不';不要收集所有内容,java,xml,sax,Java,Xml,Sax,我正在使用SAX解析器解析XML,并且工作正常 我有以下XML标记 <value>•CERTASS >> Certass</value> 不能保证characters()方法在元素中只运行一次 如果将内容存储在字符串中,并且characters()方法碰巧运行了两次,则只能从第二次运行中获取内容。第二次运行characters方法时,它将覆盖第一次存储的temp变量的内容 要解决此问题,请使用StringBuilder和append()处理character

我正在使用SAX解析器解析XML,并且工作正常

我有以下XML标记

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

不能保证
characters()
方法在元素中只运行一次

如果将内容存储在
字符串中
,并且
characters()
方法碰巧运行了两次,则只能从第二次运行中获取内容。第二次运行characters方法时,它将覆盖第一次存储的
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());
     }
 };
解析
字符串
•CERTASS>>CERTASS
”,上面的处理程序给出输出:

?CERTASS >> Certass

我希望这能有所帮助。

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

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

谢谢你的回答。我有wuch>>这样的护照,>>通行证加上。这个逻辑能处理吗?另外,我可以使用DOM解析器来避免此类问题吗?实际上,DOM解析器甚至不允许您解析带有未转义特殊字符的文档。我很高兴能帮上忙。
"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;
 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 = "";
     }
   }
}