gpt4 book ai didi

java - SAX 解析器 : Ignoring special characters

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:37:48 25 4
gpt4 key购买 nike

我正在使用 Xerces 来解析我的 XML 文档。问题是像   这样的 XML 转义字符出现在 characters() 方法中作为非转义字符。我需要按原样在 characters() 方法中获取转义字符。

谢谢。

UPD:试图在我的 DefaultHandler 的后代中覆盖 resolveEntity() 方法。从调试中可以看出,它被设置为 XML 阅读器的实体解析器,但未调用覆盖方法的代码。

最佳答案

我认为您的解决方案还不错:几行代码就可以完全满足您的需求。问题是 ContentHandler 接口(interface)没有提供 startEntityendEntity 方法,所以你必须写一个 LexicalHandler它与您的 ContentHandler 结合使用。通常,使用 XMLFilter 更优雅,但您必须处理实体,所以您仍然应该编写一个 LexicalHandler。看看here了解 SAX 过滤器的使用。

我想向您展示一种与您的方法非常相似的方法,它允许您将过滤操作(例如包装 & 到 & )与输出操作(或其他)分开。我基于 XMLFilterImpl 编写了自己的 XMLFilter,它也实现了 LexicalHandler 接口(interface)。此过滤器仅包含与实体转义/转义相关的代码。

public class XMLFilterEntityImpl extends XMLFilterImpl implements
LexicalHandler {

private String currentEntity = null;

public XMLFilterEntityImpl(XMLReader reader)
throws SAXNotRecognizedException, SAXNotSupportedException {
super(reader);
setProperty("http://xml.org/sax/properties/lexical-handler", this);
}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (currentEntity == null) {
super.characters(ch, start, length);
return;
}

String entity = "&" + currentEntity + ";";
super.characters(entity.toCharArray(), 0, entity.length());
currentEntity = null;
}

@Override
public void startEntity(String name) throws SAXException {
currentEntity = name;
}

@Override
public void endEntity(String name) throws SAXException {
}

@Override
public void startDTD(String name, String publicId, String systemId)
throws SAXException {
}

@Override
public void endDTD() throws SAXException {
}

@Override
public void startCDATA() throws SAXException {
}

@Override
public void endCDATA() throws SAXException {
}

@Override
public void comment(char[] ch, int start, int length) throws SAXException {
}
}

这是我的主程序,使用 DefaultHandler 作为 ContentHandler 根据过滤器代码接收实体:

public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException {

DefaultHandler defaultHandler = new DefaultHandler() {
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//This method receives the entity as is
System.out.println(new String(ch, start, length));
}
};

XMLFilter xmlFilter = new XMLFilterEntityImpl(XMLReaderFactory.createXMLReader());
xmlFilter.setContentHandler(defaultHandler);
String xml = "<html><head><title>title</title></head><body>&amp;</body></html>";
xmlFilter.parse(new InputSource(new StringReader(xml)));
}

这是我的输出:

title
&amp;

可能你不喜欢它,无论如何这是一个替代解决方案。

很抱歉,但是对于 SaxParser,我认为您没有更优雅的方法。

您还应该考虑切换到 StaxParser:将 XMLInputFactory.IS_REPLACING_ENTITY_REFERENCE 设置为 false 可以很容易地执行您想要的操作。如果你喜欢这个解决方案,你应该看看here .

关于java - SAX 解析器 : Ignoring special characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5475202/

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