我正在解析一个包含名称空间前缀名称的元素的SOAP:
<ns1:equipmentType>G</ns1:equipmentType>
因此解析器忠实地创建了带有名称空间前缀的元素:
ns1:equipmentType
我可以告诉解析器过滤掉所有名称空间前缀吗?所以元素名称将是:
equipmentType
我的代码:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = documentBuilder.parse(inputStream);
答案 0 :(得分:5)
我没有看到你将解析器设置为名称空间感知,所以这里很可能是缺少的东西。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inputStream);
然后在节点上调用getLocalName()
将为您提供没有任何前缀的名称。
但是,如果这对你来说还不够,而你真的想要删除名称空间,你可以使用XML转换来创建一个没有名称空间的新DOM树:
Transformer trans = TransformerFactory.newInstance().newTransformer(
new StreamSource(new StringReader("<?xml version='1.0'?>"
+"<stylesheet xmlns='http://www.w3.org/1999/XSL/Transform' version='1.0'>"
+ "<template match='*' priority='1'>"
+ "<element name='{local-name()}'><apply-templates select='@*|node()'/></element>"
+ "</template>"
+ "<template match='@*' priority='0'>"
+ "<attribute name='{local-name()}'><value-of select='.'/></attribute>"
+ "</template>"
+ "<template match='node()' priority='-1'>"
+ "<copy><apply-templates select='@*|node()'/></copy>"
+ "</template>"
+"</stylesheet>")));
DOMResult result=new DOMResult();
trans.transform(new DOMSource(document), result);
document=(Document)result.getNode();
答案 1 :(得分:1)
确保在setNamespaceAware(true)
上DocumentBuilderFactory
。
在生成的Document实例上,您可以使用getLocalName()
获取不带前缀的元素名称。
您还可以使用例如getElementsByTagNameNS()
,其中提供命名空间URI和本地标记名称以查找所需的元素。这会将您的代码与该特定文档中用于该命名空间的实际前缀分离。我认为这实际上就是你所追求的。