Конвертировать все пространство имен элемента dom4j - PullRequest
0 голосов
/ 22 апреля 2020

Если у меня есть элемент XML как таковой:

<First id="" name="">
  <Second id="" name="">
  </Second>
</First>

Как я могу использовать dom4j для преобразования пространства имен в нечто подобное ниже? Есть ли простой способ?

<test:First test:id="" test:name="">
  <test:Second test:id="" test:name="">
  </test:Second>
</test:First>

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Если вы предпочитаете решение Java centri c, DOM4J поддерживает обход дерева документов:

    Document doc = DocumentHelper.parseText(XML);
    final Namespace ns = Namespace.get("test", "urn:foo:bar");
    doc.accept(new VisitorSupport() {
        @Override
        public void visit(Element node) {
            node.setQName(QName.get(node.getName(), ns));
            // Attribute QNames are read-only, so need to create new
            List<Attribute> attributes = new ArrayList<Attribute>();
            while(node.attributes().size() > 0)
                attributes.add(node.attributes().remove(0));
            for(Attribute a: attributes) {
                node.addAttribute(QName.get(a.getName(), ns), a.getValue());
            }
        }
    });
0 голосов
/ 22 апреля 2020

Вы можете запустить XSLT-преобразование:

  <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:template match="*">
      <xsl:element name="test:{local-name()}" namespace="http://test-namepace/ns">
        <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
      <xsl:attribute name="test:{local-name()}" namespace="http://test-namepace/ns">
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:template>
  </xsl:transform>

Я думаю, что DOM4J имеет методы для непосредственного применения преобразования XSLT 1.0, но у вас также есть возможность использовать Saxon, который обрабатывает DOM4J в качестве ввода и / или выводите вместе со многими другими моделями деревьев.

Кстати, (a) в вашем примере требований, документ результата плохо сформирован, потому что он не объявляет пространство имен, и (b) обычно не считается хорошей практикой поместите все атрибуты в то же пространство имен, что и содержащие элементы; Я дал вам решение, предполагая, что у вас есть веские причины для этого довольно странного замысла.

...