0

示例 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;但我需要片段标签内的整个值才能打印出来。

使用数组列表。用于获取和检索值的 getter 和 setter 方法。

4

3 回答 3

2

使用方法“字符”。

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

意思是,您必须实现startElementandendElement方法(以表明您正在输入和退出“片段”标签,然后该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
   }
}
于 2013-04-25T15:12:12.123 回答
0

是的。

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

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

您可以在此处查看示例实现

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

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() 方法,因此您只能在正确的时间重新实例化字符串缓冲区)

于 2013-04-25T15:31:38.197 回答
0

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

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

2) Snippet 中的文本包含多行,使用 SAX,您将分别获取每一行,此行为记录在 SAX API 中,它可能取决于提供者,但至少使用 JDK 默认 SAX 解析器您无法更改它。试试 StAX,它有解决这个问题的 XMLInputFactory.IS_COALESCING 选项。

于 2013-04-25T15:40:05.700 回答