Добавить пространство имен к корневому элементу и префикс для всех дочерних JDOM

Я попытался создать XML-документ с помощью JDOM:

Node N =Effective_Change.getElementsByTagName("xml-fragment").item(0);
                         NewElement=N.getOwnerDocument().createElementNS(namespace, N.getNodeName());

                         Namespace sNS =Namespace.getNamespace(prefix,namespace);
                         list = N.getChildNodes();
                         NodeList ListInter=null;
                         org.jdom.Element subroot=null;
                        for(int c=1;c<list.getLength();c++) {
                            if(!(list.item(c).getNodeName().equals("#text"))){
                                if(list.item(c).getChildNodes().getLength()>1) {
                                    System.out.println("true : "+list.item(c).getChildNodes().getLength());
                                }
                                else {
                                    subroot=new org.jdom.Element(list.item(c).getNodeName(), sNS);
                                    subroot.addContent(list.item(c).getTextContent());
                                }


                                root.addContent(subroot);
                                XMLOutputter outp = new XMLOutputter();
                                String s = outp.outputString(root);
                                System.out.println(s);
                            }
                        }

Моя входная строка xml:

<xml-fragment>
  <Derived_Event_Code>xx</Derived_Event_Code>
  <Effective_Moment>2018-07-23T04:20:04</Effective_Moment>
  <Entry_Moment>2018-07-23T04:20:04</Entry_Moment>
  <Person_Identification isUpdated="1">
    <Government_Identifier isDeleted="1">
      <Government_ID>xxxx</Government_ID>
      <Government_ID_Type>xxxx</Government_ID_Type>
      <Issued_Date>xxxx</Issued_Date>
    </Government_Identifier>
  </Person_Identification>
</xml-fragment>

Фактический результат:

<xml-fragment xmlns="urn:com.uri/peci">
    <peci:Derived_Event_Code xmlns:peci="urn:com.workday/peci">DTA</peci:Derived_Event_Code>
    <peci:Effective_Moment xmlns:peci="urn:com.workday/peci">2018-07-23T04:20:04</peci:Effective_Moment>
    <peci:Entry_Moment xmlns:peci="urn:com.workday/peci">2018-07-23T04:20:04</peci:Entry_Moment>
</xml-fragment>

и мне нужен вывод, подобный этому коду ниже: пространство имен только для корневого тега, в данном случае для xml-фрагмента и для остальных тегов мне нужен только префикс без пространства имен и без атрибута xmlns: "" для дочерних тегов .

<xml-fragment xmlns="urn:com.uri/peci">
    <peci:Derived_Event_Code>xx</peci:Derived_Event_Code>
    <peci:Effective_Moment>2018-07-23T04:20:04</peci:Effective_Moment>
    <peci:Entry_Moment>2018-07-23T04:20:04</peci:Entry_Moment>
</xml-fragment>

и даже когда я пытался

subroot.setNamespace(sNS.NO_NAMESPACE);

Я получил в дочерних тегах атрибут xmlns: ""

Мне действительно нужна помощь !!


person jlassi aladin    schedule 30.11.2018    source источник
comment
использование xslt также может работать   -  person rogerdpack    schedule 08.02.2019


Ответы (2)


То, о чем вы просите, не имеет смысла. Если требуемый документ анализируется парсером, поддерживающим пространство имен, он недействителен, поскольку для префикса peci не существует объявления пространства имен. Если он анализируется парсером, не знающим о пространстве имен, документ действителен, но тогда у корневого элемента нет пространства имен, как и у других элементов, но их локальные имена изменились.

Вы действительно этого хотите?

ОБНОВЛЕНИЕ

Я видел из вашего (удаленного) ответа, что, возможно, вы хотите просто изменить пространство имен для всех элементов. В этом случае может помочь:

... 
Document d = new SAXBuilder().build(...);
updateNamespace(d.getRootElement(), Namespace.getNamespace("peci", "urn:com.uri/peci"));
...

static void updateNamespace(Element e, Namespace ns) {
    e.setNamespace(ns);
    for(Element child: e.getChildren()) {
        updateNamespace(child, ns);
    }
}

После этого вы можете отфильтровать элементы, которые вам не нужны в итоговом документе.

person forty-two    schedule 01.12.2018

person    schedule
comment
Привет, пожалуйста, не просто копируйте код вставки, но также объясните, что вы там делали, так как тот, кто спрашивает, может не знать концепцию вашего кода. Спасибо :) - person Anas; 02.10.2020