Распространение префиксов на дочерний элемент при печати XML DOM в String в Java - PullRequest
4 голосов
/ 12 января 2011

Я создаю XML с API-интерфейсом DOM в java, как показано ниже

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element root = document.createElement("root");
document.appendChild(root);
Element one = document.createElementNS("http://ns1", "one");
root.appendChild(one);
one.setPrefix("ns1");

Element two = document.createElementNS("http://ns1", "two");
one.appendChild(two);

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

Код:

public static String transformDOMtoText(final org.w3c.dom.Node domElement) throws TransformerException {

 final Transformer transformer = getTransformer();
 final DOMSource domSource = new DOMSource(domElement);

 final StringWriter stringWriter = new StringWriter();
 final StreamResult result = new StreamResult(stringWriter);
 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$ //$NON-NLS-2$
 transformer.setOutputProperty(
   OutputKeys.OMIT_XML_DECLARATION, "yes"); //$NON-NLS-1$ //$NON-NLS-2$
 transformer.setOutputProperty(
   "{http://xml.apache.org/xslt}indent-amount", "1");

 transformer.transform(domSource, result);

 String text = stringWriter.toString();

 return text.trim();
}

Текущий вывод ::

<root>
 <ns1:one xmlns:ns1="http://ns1">
  <two xmlns="http://ns1">
  </two>
 </ns1:one>
</root>

Ожидаемый результат ::

<root>
 <ns1:one xmlns:ns1="http://ns1">
  <ns1:two>
  </ns1:two>
 </ns1:one>
</root>

1 Ответ

4 голосов
/ 27 января 2011

Второй атрибут в createElementNS() является квалифицированным именем (QName). Поэтому, если вы не укажете префикс для имени элемента, ваш элемент будет иметь префикс, а пространство имен будет добавлено в качестве пространства имен по умолчанию.

Вместо (= то, что вы написали)

Element two = document.createElementNS("http://ns1", "two");

явно указать желаемый префикс для элемента «два»

Element two = document.createElementNS("http://ns1", "ns1:two");

или извлеките префикс из родительского элемента вместо его жесткого кодирования

Element two = document.createElementNS("http://ns1", one.getPrefix() + ":" + "two");

Обратите внимание, что Node.getPrefix() вернет null, если префикс не указан. Конечно, хранение префикса в строковой переменной облегчает задачу.

PS. Эти примеры кода не проверены, поэтому правильный результат не гарантирован, но, как мне кажется, он должен работать.

...