NamespaceContext并在XPath中使用名称空间

解决在Java中包含名称空间的xpath似乎需要使用一个NamespaceContext对象,将前缀映射到名称空间url,反之亦然。但是,NamespaceContext除了自己实现之外,我找不到其他机制。这似乎违反直觉。

是否有任何简单的方法可以NamespaceContext从文档中获取文档,或者创建文档,或者失败文档,以完全放弃前缀并使用完全限定的名称指定xpath?

回答:

无需编写自己的类就可以获取 NamespaceContext

实例。它的类使用页面显示您可以使用javax.xml.stream包获得其中一个。

String ctxtTemplate = "<data xmlns=\"http://base\" xmlns:foo=\"http://foo\" />";

NamespaceContext nsContext = null;

XMLInputFactory factory = XMLInputFactory.newInstance();

XMLEventReader evtReader = factory

.createXMLEventReader(new StringReader(ctxtTemplate));

while (evtReader.hasNext()) {

XMLEvent event = evtReader.nextEvent();

if (event.isStartElement()) {

nsContext = ((StartElement) event)

.getNamespaceContext();

break;

}

}

System.out.println(nsContext.getNamespaceURI(""));

System.out.println(nsContext.getNamespaceURI("foo"));

System.out.println(nsContext

.getNamespaceURI(XMLConstants.XMLNS_ATTRIBUTE));

System.out.println(nsContext

.getNamespaceURI(XMLConstants.XML_NS_PREFIX));

完全放弃前缀可能会导致模棱两可的表达式-

如果要删除名称空间前缀,则需要更改文档格式。从文档创建上下文不一定有意义。前缀必须匹配XPath表达式中使用的前缀,而不是任何文档中的前缀,如以下代码所示:

String xml = "<data xmlns=\"http://base\" xmlns:foo=\"http://foo\" >"

+ "<foo:value>"

+ "hello"

+ "</foo:value>"

+ "</data>";

String expression = "/stack:data/overflow:value";

class BaseFooContext implements NamespaceContext {

@Override

public String getNamespaceURI(String prefix) {

if ("stack".equals(prefix))

return "http://base";

if ("overflow".equals(prefix))

return "http://foo";

throw new IllegalArgumentException(prefix);

}

@Override

public String getPrefix(String namespaceURI) {

throw new UnsupportedOperationException();

}

@Override

public Iterator<String> getPrefixes(

String namespaceURI) {

throw new UnsupportedOperationException();

}

}

XPathFactory factory = XPathFactory.newInstance();

XPath xpath = factory.newXPath();

xpath.setNamespaceContext(new BaseFooContext());

String value = xpath.evaluate(expression,

new InputSource(new StringReader(xml)));

System.out.println(value);

StAX

API返回的实现或以上方法均未实现文档中定义的完整类

/

方法协定。您可以在此处获得基于地图的完整实现。

以上是 NamespaceContext并在XPath中使用名称空间 的全部内容, 来源链接: utcz.com/qa/420354.html

回到顶部