JDOM2、xmlns (xsd) 不能从 XML 文档中更改或删除

Posted

技术标签:

【中文标题】JDOM2、xmlns (xsd) 不能从 XML 文档中更改或删除【英文标题】:JDOM2, xmlns (xsd) c'ant change or remove from XML document 【发布时间】:2018-03-12 05:28:12 【问题描述】:

我没有 xml 文档的 xsd 文件,所以我必须更改为默认 xmlns "http://www.w3.org/2001/XMLSchema-instance" 来解析 XML 元素,但是当我更改根元素的 xmlns 属性(myroot ) 在子元素(数据)中创建另一个属性(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);


【问题讨论】:

【参考方案1】:

我不太明白你为什么要将元素移动到不同的命名空间(尤其是命名空间http://www.w3.org/2001/XMLSchema-instance,这不是为此目的),但如果你想这样做,你必须改变所有元素,而不仅仅是最外面的元素。虽然命名空间声明只出现在最外层的元素上,但它的作用是把所有元素都放在这个命名空间中,除非你改变它们,否则它们将保留在那个命名空间中。

【讨论】:

我想从输入的XML文件中删除属性xmlns,但是不知道怎么做。 那么首先需要了解的是源 XML 中的 xmlns 属性对解析后的 XML 的 JDOM 表示中节点的名称和其他属性的影响。抱歉,如果我没有解释清楚。我再试一次:最外层元素的 xmlns 属性会更改树中每个元素的命名空间 URI,要摆脱命名空间,您需要更改每个元素的名称。

以上是关于JDOM2、xmlns (xsd) 不能从 XML 文档中更改或删除的主要内容,如果未能解决你的问题,请参考以下文章

Android JDOM2 xml解析,IOExcetion

使用 linq to xml 从 xml 文档中删除 xmlns="something"

如何使用包含冒号的属性的xsd.exe? (XML:朗)

详解 xml 文件头部的 xmlns:xsi

xsd文件怎么引入进xml文档

编辑xml文件