Добавить пространство имен к корневому элементу и префикс для всех дочерних JDOM - PullRequest
0 голосов
/ 30 ноября 2018

Я пытался создать 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: ""

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

1 Ответ

0 голосов
/ 01 декабря 2018

То, что вы просите, не имеет смысла.Если разыскиваемый документ анализируется с помощью анализатора, поддерживающего пространство имен, он недопустим, поскольку для префикса 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);
    }
}

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

...