2012-11-02 7 views
1

Я обновляю один xml, используя dom4j, как показано ниже.добавление пространства имен и префикса пространства имен с использованием dom4j

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> 

который Сюд выглядеть

<AEService:jmsProducer xmlns:AEService="http://www.tibco.com/xmlns/aemeta/services /2002" objectType="endpoint.JMSPublisher" name="Pub1EndPoint"> 
    <AEService:wireFormat>aeXml</AEService:wireFormat> 

любая помощь высоко appriciated. стукнувшись на это в течение двух дней, пробовал использовать documentfactory метод все еще бесполезно.

ответ

1

Предлагаю вам сбрасывать dom4j и использовать JAXB или StAX. Если вы не можете сделать это, попробуйте ниже (я не проверял это так пост последующие вопросы в комментариях)

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

я не могу добавить к этому документу самим получать исключение, но при добавлении к элементу оно не добавит, но когда я пытаюсь как пространство имен нс = новое пространство имен (": AEService", "HTTP: //www.tibco.com/xmlns/aemeta/services/2002 "), то xml появляется как" ', если каким-то образом можно удалить дополнительный двоеточие, моя работа будет выполнена. – user1487454

+0

Этот дополнительный столбец из-за вашего кода. Изменение пространства имен ns = новое пространство имен (": AEService "," tibco.com/xmlns/aemeta/services/2002 ") в пространство имен ns = новое пространство имен (« AEService »,« tibco.com/xmlns/aemeta/services/2002 ») –

+0

У вас есть двоеточие перед AEService, создавая дополнительный двоеточие –

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

Надеется, что это помогает

2

Я понимаю, что это старое thread и dom4j, возможно, не имели достаточных возможностей пространства имен во время написания ответов, но похоже, что dom4j теперь может легко выполнить это с использованием версии, которую я использую (1 .6.1). Я пришел сюда, чтобы найти помощь в том, как создать XML-пространство, поддерживающее пространство имен, с dom4j, размещение моего кода 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> 

Надеется, что это помогает.

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

Вы указали переменную 'ns' и не используете ее. Вы также используете переменную' ns1', но вы ее не объявляете. даже компилируется как фрагмент. –

 Смежные вопросы

  • Нет связанных вопросов^_^