使用SAX解析XML

时间:2013-04-25 15:09:07

标签: java xml sax

示例xml,

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Issue>
     <Snippet>     
           sri;;
           hiil
           bye;
           tc;
    </Snippet>
    </Issue>

是否可以将整个字符放入片段标签?

如果这是实施,

    public void startElement(String uri, String localName,
             String qName, Attributes attributes) throws SAXException {
      temp = "";
      if (qName.equalsIgnoreCase("Issue")) {
             acct = new Account();

      public void endElement(String uri, String localName, String qName)
             throws SAXException {

      if (qName.equalsIgnoreCase("Issue")) {
             // add it to the list
             accList.add(acct);
       else if(qName.equalsIgnoreCase("Snippet"))
           {
               acct.setPrimarySnippet(temp);
           }

O / p是tc;但我需要在片段标签内的整个值来打印。

使用了arraylist。用于拉伸和检索值的getter和setter方法。

3 个答案:

答案 0 :(得分:2)

使用方法“characters”。

http://docs.oracle.com/javase/1.5.0/docs/api/org/xml/sax/helpers/DefaultHandler.html#characters(char [],int,int)

意思是,您必须实施startElementendElement方法(表示您正在输入和退出'Snippet'标记,然后characters方法将返回字符。

  public void startElement(String uri, String localName,
             String qName, Attributes attributes) throws SAXException {
      temp = "";
      if (qName.equalsIgnoreCase("Issue")) {
             someFlagVariable = true;

 public void endElement(String uri, String localName, String qName)
             throws SAXException {
      if (qName.equalsIgnoreCase("Issue")) {
             someFlagVariable = false;
      }
 }
public void characters(char[] ch,
                   int start,
                   int length)
            throws SAXException{
   if (someFlagVariable ){
       String content = new String(ch, start, length).trim(); //this is your content
   }
}

答案 1 :(得分:0)

您应该在characters()方法中获取“temp”的值(您设置为主要代码段的值)。

但是,您应该知道不能保证何时执行characters(),并且可以在单个节点内多次调用。因此,在你覆盖characters()方法时,你需要构建一个字符串 - 当你到达endElement()时,你将获得完整的值。

您可以看到示例实现here

但你基本上想要这样的东西:

StringBuffer chars = new StringBuffer();

public void startElement(String uri, String localName, String qName, Attributes atts) {
    chars = new StringBuffer();
}

public void endElement(String uri, String localName, String qName) throws SAXException {
    if (qName.equalsIgnoreCase("Issue")) {
        // add it to the list
        accList.add(acct);
     else if(qName.equalsIgnoreCase("Snippet")){
        acct.setPrimarySnippet(chars);
     }
}

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

(虽然注意,上面只有在你只关心叶子节点中的文本时才有效 - 因为我们在startElement()上新建了stringBuffer,如果你想要非叶子节点的文本那么你需要介绍startElement()方法中的标志,因此您只能在正确的时间重新实例化stringbuffer)

答案 2 :(得分:0)

1)要在Snippet中打印文本,你应该实现

public void characters(char ch[], int start, int length)

2)Snippet内的文本包含几行,使用SAX你将分别得到每一行,这种行为记录在SAX API中,它可能依赖于提供者,但至少使用JDK默认的SAX解析器你无法改变它。试试StAX,它有XMLInputFactory.IS_COALESCING选项来解决这个问题。