添加命名空间和命名空间前缀使用的dom4j

问题描述 投票:1回答:5

我和下面使用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方法还是没有用。

java xml-parsing xml-namespaces dom4j
5个回答
3
投票

我知道这是一个古老的线程,并在答案写在时间的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>

希望这可以帮助。


1
投票

我建议你倾倒的dom4j和使用JAXB或StAX的。如果你不能这样做,那么试试下面的(我没有验证这一点使后跟进的问题作为评论)

Namespace ns = new Namespace("AEService","http://www.tibco.com/xmlns/aemeta/services/2002")
document.add(ns);

0
投票

我发现,为了使命名空间是正确设置它需要对整个节点层次递归设置。

这两种方法做的伎俩:

   /**
    * 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" ) );

希望这可以帮助


0
投票

我能够在子元素与下面的步骤根元素,而不是添加命名空间:

  1. 发现使用XPath从创建的文档节点。
  2. 创建命名空间的前缀名称和值。
  3. 添加为元素插入节点如下: 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));

0
投票

使用图书馆的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表达式。

注意:一个空的命名空间是不允许的。你需要指定一个前缀。

© www.soinside.com 2019 - 2024. All rights reserved.