gpt4 book ai didi

java - 在 SAXParser 中捕获部分 XML 代码的方法

转载 作者:行者123 更新时间:2023-11-30 09:07:11 24 4
gpt4 key购买 nike

我需要在 <page> 内捕获文本我的 XML 文件的标签。整个文本,以及其他标签、它们的属性等。我可以使用例如正则表达式来做到这一点,但我需要这样做是安全的,所以我想使用 SAXParser。

但恐怕 ContentHandler 可以从 SAXParser 接收到的所有信息都不足以执行此操作(例如,找到的 XML 标记开头的光标位置会有很大帮助)。

那么,还有其他安全的方法吗?

而不是 <page> 中的文本,例如,它可能是 DOM 树,但为了性能,我更喜欢第一种方式。

最佳答案

好的,我首先要做的是为自己创建一个自定义 DefaultHandler类似下面的内容;

public class PrintXMLwithSAX extends DefaultHandler {

private int embedded = -1;
private StringBuilder sb = new StringBuilder();
private final ArrayList<String> pages = new ArrayList<String>();


@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equals("page")){
embedded++;
}
if(embedded >= 0) sb.append("<"+qName+">");
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if(embedded >= 0) sb.append(new String(ch, start, length));
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(embedded >= 0) sb.append("</"+qName+">");
if(qName.equals("page")) embedded--;
if(embedded == -1){
pages.add(sb.toString());
sb = new StringBuilder();
}
}

public ArrayList<String> getPages(){
return pages;
}

}

DefaultHandler (解析时)遍历每个元素并调用 startElement() , characters() , endElement()和其他一些人。上面的代码检查 startElement() 中的元素是否是 <page>元素。如果是这样,它会递增 embedded通过 1. 之后,每个方法检查是否 embedded >= 0。如果是,它将每个元素内的字符及其标签(不包括此特定示例中的属性)附加到 StringBuilder目的。 endElement()减量 embedded当它找到 </page> 的结尾时元素。如果 embedded 回退到 -1,我们知道我们不再在一系列页面元素中,因此我们添加 StringBuilder 的结果。到 ArrayList pages并开始新的StringBuilder等待另一个<page>元素。

然后您需要运行处理程序然后检索您的 ArrayList包含您的 <page> 的字符串像这样的元素;

    SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
PrintXMLwithSAX handler = new PrintXMLwithSAX();
InputStream input = new FileInputStream("C:\\Users\\me\\Desktop\\xml.xml");
saxParser.parse(input, handler);
ArrayList<String> myPageElements = handler.getPages();

现在myPageElements是一个 ArrayList包含所有页面元素及其内容作为字符串。

希望对您有所帮助。

关于java - 在 SAXParser 中捕获部分 XML 代码的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24085292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com