I am trying to programmatically edit an XML file by loading it into a Document object and manipulating it there. This portion on the program works however if I load the XML into either an InputStream or write it back to a file, all the bean tags have xmlns=""
attribute added to them.
So if before I had:
<bean id="discoverySpi" class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi"> <property name="ipFinder" ref="ipFinder" /> </bean>
I get back out:
<bean xmlns="" class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi" id="discoverySpi"> <property name="ipFinder" ref="ipFinder"/> </bean>
This happens to all bean tags weather or not they are edited. I verified that simply reading the XML file and writing it back out with the following code without making any changes to the Document object still causes the error.
I assume this is happening when I create the DOMSource object but do not know how to stop this from happening.
Currently these added attributes are causing errors when I try to use the XML file.
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);
Advertisement
Answer
Firstly, add
docBF.setNamespaceAware(true);
Secondly, make sure that whenever you add an element programmatically to the DOM, you use the namespace-aware versions of the methods, for example createElementNS()
.
Consider using a library such as XOM or JDOM2 in preference to DOM. The popularity of DOM never ceases to astound me when far better alternatives are available.