JDOM2,xmlns(xsd)不能更改或从XML文档中删除
问题描述:
我没有xml文档的xsd文件,所以我必须更改为默认xmlns“http://www.w3.org/2001/XMLSchema-instance”来分析XML元素,但是存在问题这样做,当我更改根元素(myroot)的xmlns属性时,在值为“myxsd.xsd”的子元素(数据)中创建另一个属性(xmlns)。 我想忽略或更改xmlns(myxsd.xsd)的值以正确解析文档。JDOM2,xmlns(xsd)不能更改或从XML文档中删除
我的XML输入:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<myroot xmlns="myxsd.xsd" class="15">
<data att1="all" att2="actual">
<myobject patt1="patt1_value" patt2="patt2_value" patt3="patt3_value">
<p name="p1">page1</p>
<p name="p2">page1</p>
<p name="p3">page1</p>
<p name="p4">page4</p>
</myobject>
</data>
</myroot>
我的XML输出:
<?xml version="1.0" encoding="UTF-8"?>
<myroot xmlns="http://www.w3.org/2001/XMLSchema-instance" class="15">
<data xmlns="myxsd.xsd" att1="all" att2="actual">
<myobject patt1="patt1_value" patt2="patt2_value" patt3="patt3_value">
<p name="p1">page1</p>
<p name="p2">page1</p>
<p name="p3">page1</p>
<p name="p4">page4</p>
</myobject>
</data>
</myroot>
我的代码:
public void Edit_file() throws JDOMException, IOException {
InputStream in = new FileInputStream("C:\\small_test.xml");
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(in);
// getting the root element
Element root = document.getRootElement();
Namespace tempNamespace = Namespace.getNamespace("http://www.w3.org/2001/XMLSchema-instance");
root.setNamespace(tempNamespace);
// iterating over the children
List<Element> data = root.getChildren("data");
for (Element element : data) {
Attribute id = element.getAttribute("att1");
id.setValue("New value");
}
XMLOutputter xmlOutput = new XMLOutputter();
xmlOutput.setFormat(Format.getPrettyFormat());
xmlOutput.output(document, System.out);
}
答
我真的不明白,为什么你要的元素进入一个不同的名称空间(特别是名称空间http://www.w3.org/2001/XMLSchema-instance
,不是为此目的),b如果你想这样做,你必须改变所有的元素,而不仅仅是最外层的元素。虽然名称空间声明只出现在最外层的元素上,但它具有将所有元素放在此名称空间中的效果,并且除非您更改它们,否则它们将保留在该名称空间中。
我想从输入的XML文件中删除属性xmlns,但我不知道它是如何做到的。 –
然后,首先需要了解的是源XML中的xmlns属性对分析的XML的JDOM表示中节点的名称和其他属性的影响。对不起,如果我没有解释这一点。我会再试一次:最外层元素上的xmlns属性会更改树中每个元素的名称空间URI,为了摆脱名称空间,您需要更改每个元素的名称。 –