使用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);
答案 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>
在本文档中,以下陈述是正确的:
documentObject
和element1
位于http://www.myschema.com
命名空间中。
属性attr1
不在任何名称空间中。
虽然名称没有前缀的元素将在任何默认命名空间中生效,但名称未加前缀的 attributes 不在任何名称空间中。请参阅spec:
默认命名空间声明不直接应用于属性名称;对无前缀属性的解释由它们出现的元素决定。
所以为了获得你想要的输出,你应该能够做到:
element1.setAttribute("attr1", value);
当然这一切都取决于所需的输出是否正确。如果真的attr1
必须在命名空间中,那么您所需的输出是不正确的。