将 XML 加载到 DOmSource 正在将 xmlns="" 添加到所有 bean 标记

Posted

技术标签:

【中文标题】将 XML 加载到 DOmSource 正在将 xmlns="" 添加到所有 bean 标记【英文标题】:Loading XML into DOmSource is adding xmlns="" to all bean tags 【发布时间】:2021-10-30 12:43:23 【问题描述】:

我正在尝试通过将 XML 文件加载到 Document 对象中并在那里对其进行操作来以编程方式编辑它。程序的这一部分可以工作,但是如果我将 XML 加载到 InputStream 或将其写回文件,所有 bean 标记都添加了 xmlns="" 属性。

所以如果我之前有:

<bean id="discoverySpi" class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
    <property name="ipFinder" ref="ipFinder" />
</bean>

我回来了:

<bean xmlns="" class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi" id="discoverySpi">
    <property name="ipFinder" ref="ipFinder"/>
</bean>

这发生在所有 bean 标签天气或没有被编辑。我验证了简单地读取 XML 文件并使用以下代码将其写回而不对 Document 对象进行任何更改仍然会导致错误。

我假设在我创建 DOMSource 对象时会发生这种情况,但不知道如何阻止这种情况发生。

目前,当我尝试使用 XML 文件时,这些添加的属性会导致错误。

String XML_PATH = "./some/path/in/project/someXML.xml";

DocumentBuilderFactory docBF = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBF.newDocumentBuilder();
Document doc = docBuilder.parse(XML_PATH);

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(doc);
StreamResult streamResult = new StreamResult(new File("./some/output/path/modifiedXml.xml"));
transformer.transform(domSource, streamResult);

【问题讨论】:

【参考方案1】:

首先,添加

docBF.setNamespaceAware(true);

其次,确保每当您以编程方式将元素添加到 DOM 时,都使用可识别名称空间的方法版本,例如 createElementNS()

考虑使用 XOM 或 JDOM2 等库而不是 DOM。当有更好的替代方案可用时,DOM 的流行从未停止让我感到惊讶。

【讨论】:

添加docBF.setNamespaceAware(true); 解决了这个问题。我尝试更改为getElementsByTagName()getNamedItemNS(),但文档的命名空间为空。传递由 getNamespaceURI 返回的空值或命名空间值的“*”会导致这些方法不返回任何项。使用非命名空间版本目前似乎可行。我将研究 XOM 和 JDOM2,感谢您提供的信息。

以上是关于将 XML 加载到 DOmSource 正在将 xmlns="" 添加到所有 bean 标记的主要内容,如果未能解决你的问题,请参考以下文章

将外部文件中的值加载到 pom.xml

将创建 xml 文件更改为:使用 xmlreader 加载到数据表

将外部 xml 文件导入闪存

将 xml DOMDocument 转换为字符串

如何将xml加载到plist

将列表保存到 XML