首页 > 解决方案 > 将 XML 加载到 DOmSource 正在将 xmlns="" 添加到所有 bean 标记

问题描述

我正在尝试通过将 XML 文件加载到 Document 对象中并在那里进行操作来以编程方式编辑 XML 文件。但是,如果我将 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);

标签: javaxmlspringdom

解决方案


首先,添加

docBF.setNamespaceAware(true);

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

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


推荐阅读