使用Java DOM设置不带前缀的属性

时间:2014-10-16 10:57:41

标签: java xml dom namespaces

使用Java DOM我试图在属性名称之前为没有命名空间的元素设置属性。

所以,我需要的是:

<documentObject xmlns="http://www.myschema.com">
    <element1 attr1="value">foo</element1>
</documentObject>

如果我尝试将属性设置为以下element1.setAttributeNS("http://www.myschema.com", "attr1", value);,我会得到一个空的xmlns标记,另外还有一个带有前缀的xmlns,如下所示:

<element1 attr1="value" xmlns="" xmlns:ns3="http://www.myschema.com">foo</element1>

如果我尝试将属性设置为以下element1.setAttribute("xmlns:attr1", value);,我会在我的属性名称前面得到一个前缀(xmlns),如下所示:

<element1 xmlns:attr1="value">foo</element1>

至于进一步的信息,我创建了如下元素:

 Element element = dom.createElementNS("http://www.myschema.com", elemName);
 element.appendChild(dom.createCDATASection("foo");
 xmlElement.appendChild(element);

2 个答案:

答案 0 :(得分:0)

下面的代码将生成输出

<?xml version="1.0" encoding="UTF-8"?>
<documentObject xmlns="http://www.myschema.com">
    <element1 attr1="value">foo</element1>
</documentObject>

Java代码

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class XMLTest {

    public static void main(String[] args) throws ParserConfigurationException, TransformerException {

        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

        Document doc = docBuilder.newDocument();

        Element element = doc.createElementNS("http://www.myschema.com", "documentObject");
        doc.appendChild(element);

        Element element1 = doc.createElement("element1");
        element.appendChild(element1);

        element1.appendChild(doc.createTextNode("foo"));
        Attr attr = doc.createAttribute("attr1");
        attr.setValue("value");
        element1.setAttributeNode(attr);

        element.appendChild(element1);

        // write the content into xml file
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("testfile.xml"));
        transformer.transform(source, result);
        System.out.println("File saved!");
    }
}

答案 1 :(得分:0)

让我们再次查看您想要的输出:

<documentObject xmlns="http://www.myschema.com">
    <element1 attr1="value">foo</element1>
</documentObject>

在本文档中,以下陈述是正确的:

  1. documentObjectelement1位于http://www.myschema.com命名空间中。

  2. 属性attr1不在任何名称空间中。

  3. 虽然名称没有前缀的元素将在任何默认命名空间中生效,但名称未加前缀的 attributes 不在任何名称空间中。请参阅spec

      

    默认命名空间声明不直接应用于属性名称;对无前缀属性的解释由它们出现的元素决定。

    所以为了获得你想要的输出,你应该能够做到:

    element1.setAttribute("attr1", value);
    

    当然这一切都取决于所需的输出是否正确。如果真的attr1必须在命名空间中,那么您所需的输出是不正确的。