JDOM2、xmlns (xsd) 无法更改或从 XML 文档中删除
JDOM2, xmlns (xsd) c'ant change or remove from XML document
我没有 xml 文档的 xsd 文件,所以我必须更改为默认 xmlns "http://www.w3.org/2001/XMLSchema-instance" 来解析 XML 元素,但这样做有一个问题,当我更改根元素 (myroot) 的 xmlns 属性时,在子元素 (data) 中创建了另一个属性 (xmlns),其值为 "myxsd.xsd"。
我想忽略或更改 xmlns ( myxsd.xsd ) 的值以正确解析文档。
我的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
,这不是为此目的),但如果你想这样做,您必须更改所有元素,而不仅仅是最外层的元素。虽然命名空间声明只出现在最外层的元素上,但它的作用是将所有元素都放在这个命名空间中,除非您更改它们,否则它们将保留在该命名空间中。
我没有 xml 文档的 xsd 文件,所以我必须更改为默认 xmlns "http://www.w3.org/2001/XMLSchema-instance" 来解析 XML 元素,但这样做有一个问题,当我更改根元素 (myroot) 的 xmlns 属性时,在子元素 (data) 中创建了另一个属性 (xmlns),其值为 "myxsd.xsd"。 我想忽略或更改 xmlns ( myxsd.xsd ) 的值以正确解析文档。
我的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
,这不是为此目的),但如果你想这样做,您必须更改所有元素,而不仅仅是最外层的元素。虽然命名空间声明只出现在最外层的元素上,但它的作用是将所有元素都放在这个命名空间中,除非您更改它们,否则它们将保留在该命名空间中。