1

我正在解析一个 SOAP,其中包含带有名称空间前缀名称的元素:

<ns1:equipmentType>G</ns1:equipmentType>

因此解析器忠实地创建具有命名空间前缀名称的元素:

ns1:equipmentType

我可以以某种方式告诉解析器过滤掉所有的命名空间前缀吗?所以元素名称将如下所示:

equipmentType

我的代码:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = documentBuilder.parse(inputStream);
4

2 回答 2

6

我没有看到您将解析器设置为可识别名称空间,所以这很可能是这里缺少的东西。

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();
于 2013-09-17T17:02:58.863 回答
1

确保setNamespaceAware(true)DocumentBuilderFactory.

然后,在生成的 Document 实例上,您可以使用它getLocalName()来获取不带前缀的元素名称。

例如getElementsByTagNameNS(),您还可以使用提供命名空间 URI 和本地标记名称的位置来查找所需的元素。这将您的代码与该特定文档中用于该命名空间的实际前缀分离。我想这实际上是你所追求的。

于 2013-09-22T07:26:38.527 回答