我和下面使用dom4j的更新一个XML。
SAXReader reader = new SAXReader();
document = reader.read( xmlFileName );
但它会从元素的所有命名空间,以便想手动添加,但是当我尝试下面的代码它不工作。
Element e1 = root.addElement("jmsProducer");
e1.addNamespace("AEService", "http://www.tibco.com/xmlns/aemeta/services/2002");
我的XML是什么样子
<AEService:jmsProducer objectType="endpoint.JMSPublisher" name="Pub1EndPoint">
<AEService:wireFormat>aeXml</AEService:wireFormat>
其SUD的样子
<AEService:jmsProducer xmlns:AEService="http://www.tibco.com/xmlns/aemeta/services /2002" objectType="endpoint.JMSPublisher" name="Pub1EndPoint">
<AEService:wireFormat>aeXml</AEService:wireFormat>
任何帮助是非常appriciated。 敲打这对于试图2天使用documentfactory方法还是没有用。
我知道这是一个古老的线程,并在答案写在时间的dom4j可能不会有足够的命名空间的能力,但它看起来像dom4j的是,现在能够与我使用的版本来完成这个很容易(1.6.1) 。 我来到这里寻找关于如何建立与dom4j的一个命名空间感知的XML的帮助,张贴我的Java代码(建在原岗位的XML片段)的情况下,它可以帮助别人。
下面是Java代码来构建它。
Document xmldoc = DocumentHelper.createDocument();
Namespace aeServiceNs = new Namespace("AEService",
"http://www.tibco.com/xmlns/aemeta/services/2002");
Element root = xmldoc.addElement(new QName("jmsProducer", aeServiceNs))
.addAttribute("objectType", "endpoint.JMSPublisher")
.addAttribute("name", "Pub1EndPoint");
Element wireformat = root.addElement(new QName("wireFormat", aeServiceNs))
.setText("aeXml");
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
XMLWriter xmlwriter = new XMLWriter(System.out, outputFormat);
xmlwriter.write(xmldoc);
生成以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<AEService:jmsProducer
xmlns:AEService="http://www.tibco.com/xmlns/aemeta/services/2002"
objectType="endpoint.JMSPublisher" name="Pub1EndPoint">
<AEService:wireFormat>aeXml</AEService:wireFormat>
</AEService:jmsProducer>
希望这可以帮助。
我建议你倾倒的dom4j和使用JAXB或StAX的。 如果你不能这样做,那么试试下面的(我没有验证这一点使后跟进的问题作为评论)
Namespace ns = new Namespace("AEService","http://www.tibco.com/xmlns/aemeta/services/2002")
document.add(ns);
我发现,为了使命名空间是正确设置它需要对整个节点层次递归设置。
这两种方法做的伎俩:
/**
* Recursively sets the namespace of the element and all its children.
*/
private void setNamespaces( Element elem, Namespace ns ) {
setNamespace( elem, ns );
setNamespaces( elem.content(), ns );
}
/**
* Recursively sets the namespace of the List and all children if the
* current namespace is match
*/
private void setNamespaces( List l, Namespace ns ) {
Node n = null;
for ( int i = 0; i < l.size(); i++ ) {
n = ( Node ) l.get( i );
if ( n.getNodeType() == Node.ATTRIBUTE_NODE ) {
(( Attribute ) n).setNamespace( ns );
}
if ( n.getNodeType() == Node.ELEMENT_NODE ) {
setNamespaces( ( Element ) n, ns );
}
}
}
那么我可以添加命名空间,如下所示:
setNamespaces( ( Element ) xml.selectSingleNode( "/root/settings" ),
new Namespace( "", "http://www.penvision.se/printprocessor" ) );
希望这可以帮助
我能够在子元素与下面的步骤根元素,而不是添加命名空间:
发现使用XPath从创建的文档节点。
创建命名空间的前缀名称和值。
添加为元素插入节点如下:
Document document = DocumentHelper.createDocument(); Element documentRoot = null; Element created = null; Node parentNode = null; documentRoot = DocumentHelper.createElement(); parentNode = documentRoot.selectSingleNode("parentXPath"); Namespace ns = new Namespace("name","value"); created = ((Element) parentNode).addElement(new QName("elementName",ns1));
使用图书馆的dom4j:2.1.1
初始化文件后:
SAXReader reader = new SAXReader();
reader.getDocumentFactory().setXPathNamespaceURIs(ImmutableMap.of("x", "DAV:"));
Document doc = reader.read(new StringReader(xmlContent));
doc.getRootElement().selectNodes("//x:response")
我可以通过命名空间前缀x:
XPath表达式。
注意:一个空的命名空间是不允许的。 你需要指定一个前缀。