java - SAX 解析——获取文本节点的高效方式

标签 java xml sax

给定这个 XML 片段

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>

在SAX中,获取属性值很容易:

@Override
public void startElement (String uri, String localName,
              String qName, Attributes attributes) throws SAXException{
    if(qName.equals("book")){
        String bookId = attributes.getValue("id");
        ...
    }
}

但要获取文本节点的值,例如<author> 的值tag,挺难的……

private StringBuffer curCharValue = new StringBuffer(1024);

@Override
public void startElement (String uri, String localName,
              String qName, Attributes attributes) throws SAXException {
    if(qName.equals("author")){
        curCharValue.clear();
    }
}

@Override
public void characters (char ch[], int start, int length) throws SAXException
{
     //already synchronized
    curCharValue.append(char, start, length);
}

@Override
public void endElement (String uri, String localName, String qName)
throws SAXException
{
    if(qName.equals("author")){
        String author = curCharValue.toString();
    }
}
  1. 我不确定上述示例是否有效,您如何看待这种方法?
  2. 有更好的方法吗? (获取文本节点的值)

最佳答案

这是使用 SAX 执行此操作的常用方法。

请注意,每个标记可能会多次调用 characters()。看这个question获取更多信息。这是一个完整的 example .

否则你可以试试StAX .

关于java - SAX 解析——获取文本节点的高效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2064679/

相关文章:

java - 在 Spring Boot 中使用 MDC 或任何过滤器屏蔽日志消息中的密码,而不使用 logback.xml 文件

java - GWT:如何在 UiBinder 模板中使用常量

java - 我想要一种方法来从 Java 中的 URL 参数中提取有时可能包含 "& and ="的值

android - 在 Android 中有条件地更改 layout.xml 中的值

java - SAX 的 characters() 方法未解析文本节点中的特殊字符

java - 用于程序更新的反射编程

android - 如何设置大文本以动态提示textinputlayout?

android - Android 上的自定义 View 和 XML

java - Android 搜索属性中的 SAX 解析

java - DOM,SAX和StAX XML解析器之间有什么区别?