以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  SAX不能正确处理特殊字符的转义实体?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=62800)


--  作者:jiangshachina
--  发布时间:5/19/2008 9:31:00 AM

--  SAX不能正确处理特殊字符的转义实体?
刚刚学习使用SAX解析XML,遇到了两个问题。

全部程序如下:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SimpeXmlHandler extends DefaultHandler {

  private String str = null;

  private String element = null;

  public void startElement(String namespaceURI, String localName,
      String fullName, Attributes attributes) throws SAXException {
    element = fullName;
    for (int i = 0; i < attributes.getLength(); i++) {
      String qName = attributes.getQName(i);
      if (qName.equals("id")) {
        System.out.println("id=" + attributes.getValue(qName).trim());
        break;
      }
    }
  }

  public void endElement(String uri, String localName, String qName)
      throws SAXException {
    if (str != null) {
      if (element.equalsIgnoreCase("title")) {
        System.out.println("title=" + str);
      } else if (element.equalsIgnoreCase("href")) {
        System.out.println("href=" + str);
      } else if (element.equalsIgnoreCase("content")) {
        System.out.println("content=" + str);
      }
    }
  }

  public void characters(char[] chars, int start, int length)
      throws SAXException {
    str = new String(chars, start, length).trim();
  }
}

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

public class SimpleXmlTest {

  public static void main(String[] args) throws Exception {
    SimpeXmlHandler handler = new SimpeXmlHandler();
    SAXParserFactory factory = SAXParserFactory.newInstance();
    factory.setValidating(false);
    SAXParser parser = factory.newSAXParser();
    XMLReader xmlReader = parser.getXMLReader();
    xmlReader.setContentHandler(handler);
    InputSource source = new InputSource("config/sample.xml");
    xmlReader.parse(source);
  }
}

执行SimpleXmlTest解析如下的XML文件,
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <articles>
    <article id="00001">
      <title>titleValue</title>
      <href>hrefValue</href>
      <publishtime>timeValue</publishtime>
      <content>contentValue</content>
      <tag>0</tag>
    </article>
  </articles>
</root>
结果如下:
id=00001
title=titleValue
href=hrefValue
content=contentValue

将XML文件的内容换成如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <articles>
    <article id="00001">
      <title>titleValue</title>
      <href>hrefValue</href>
      <publishtime>timeValue</publishtime>
      <content>start&gt;end</content>
      <tag>0</tag>
    </article>
  </articles>
</root>
执行程序后会得到如下结果:
id=00001
title=titleValue
href=hrefValue
content=end

再将XML文件的内容换成如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <articles>
    <article id="00001">
      <title>titleValue</title>
      <href>hrefValue</href>
      <publishtime>timeValue</publishtime>
      <content>start>end</content>
      <tag>0</tag>
    </article>
  </articles>
</root>
再次执行程序后会得到如下结果:
id=00001
title=titleValue
href=hrefValue
content=start>end

似乎SAX会自动地把"&gt;"转换成">",这样就造成了错误。
一般地,在XML文件中直接使用">","<","&",...等特殊字符会造成错误,所以会使用"&gt;","&lt;","&amp",...等转义实体。
但在我的程序中,似乎恰恰与此相反。
如何解释上述情况呢?

另,将XML文件的内容换成如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <articles>
    <article id="00001">
      <title>titleValue</title>
      <href>hrefValue</href>
      <publishtime>timeValue</publishtime>
      <content>contentValue</content>
      <!-- <tag>0</tag> -->
    </article>
  </articles>
</root>
执行测试程序后会得到如下结果:
id=00001
title=titleValue
href=hrefValue
content=contentValue
content=
content=
content=

对于最后三行的"content=",我不能理解。

希望大家能为我解惑,谢谢!


--  作者:jiangshachina
--  发布时间:5/19/2008 9:36:00 AM

--  
我直接使用DK 1.4.2中包org.xml.sax和javax.xml.parsers的API。
--  作者:Qr
--  发布时间:5/19/2008 10:21:00 AM

--  
试试看将">","<","&" 转换为对应的 >,<,&,没有测试。
至于最后一个问题,很多SAX默认将注释当作节点来处理,java会不会也一样,你可以查一下相关说明。
--  作者:jiangshachina
--  发布时间:5/19/2008 10:43:00 AM

--  
感谢上面的回复。

> 试试看将">","<","&" 转换为对应的 >,<,&,没有测试。
经过测试,仍然有相同的问题。如,解析含下面内容的XML文件:
<root>
 <articles>
  <article id="00001">
   <title>titleValue</title>
   <href>hrefValue</href>
   <publishtime>timeValue</publishtime>
   <content>contentValue<</content>
   <tag>0</tag>
  </article>
 </articles>
</root>
结果,content元素的值仍然为"<"。


--  作者:Qr
--  发布时间:5/19/2008 10:50:00 AM

--  
平时没太注意这个问题,遇到特殊字符,我一般用<![CDATA[特殊字符]]>
--  作者:jiangshachina
--  发布时间:5/19/2008 10:56:00 AM

--  
> 平时没太注意这个问题,遇到特殊字符,我一般用<![CDATA[特殊字符]]>
因为提供的数据源(即XML文件)中就有这些字符,我不可能对其进行修改。
实际上,content元素的值是一段HTML语句(特殊字符已经转义过了),所以里面不可避免的会存在&gt;,&lt;,&amp;,...等语句。

而且,之前使用DOM4J时,没有遇到过这个问题,只是现在希望使用SAX。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms