Java XML Transformer Node to String удалить пространство имен - PullRequest
1 голос
/ 16 января 2020

Я использую следующий метод для преобразования узла xml в строку (обычно встречается в Интернете):

String nodeToString(Node node) {
   StringWriter sw = new StringWriter();
   try {
      Transformer t = TransformerFactory.newInstance().newTransformer();
      t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
      t.setOutputProperty(OutputKeys.INDENT, "yes");
      t.transform(new DOMSource(node), new StreamResult(sw));
   } catch (TransformerException te) {
     throw ...
   }
   return sw.toString();
}

Node, преобразованные в строку, не являются целыми xml документами, но просто части большего XML. Проблема в том, что после преобразования в String элемент root в Node добавляет к нему xmlns, что вызывает проблемы.

Это строка, возвращаемая nodeToString:

<doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <header>
         ...
     </header>
     <payload>
         ...
     </payload>
</doc> 

Хуже всего то, что это происходит не на моей машине и в среде тестирования, а только в UAT, и я изо всех сил пытаюсь найти разница между средами.

Кто-нибудь сталкивался с этой проблемой и знает, что ее вызывает?

Редактировать:

Исходный документ выглядит следующим образом:

<docs>
    <doc> 
         <header>
             ...
         </header>
         <payload>
             ...
         </payload>
    </doc>  
    <doc> 
         <header>
             ...
         </header>
         <payload>
             ...
         </payload>
    </doc>   
    // more <doc>s
<docs>  

Он разделяется с XPath на узлы (каждый узел является одним элементом), затем применяется некоторая бизнес-логика c (некоторые узлы удалены, некоторые сгруппированы по-разному), и в конце я должен вернуть ее обратно в строку.

1 Ответ

1 голос
/ 17 января 2020

Предполагая, что пространство имен xsi фактически объявлено для некоторого элемента-предка, это правильное поведение, даже если оно может быть проблематичным c для вас. В модели данных XDM, используемой XSLT (а также преобразователем идентичности JAXP), элемент имеет объявление пространства имен в области действия для каждого пространства имен, объявленного в этом элементе или любом из его предков, и когда элемент сериализуется, все не выводятся избыточные объявления пространства имен в области.

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

Вы можете избавиться от нежелательных пространств имен, выполнив преобразование перед сериализацией (с XSLT 2.0+ это так же просто, как сделать <xsl:copy-of copy-namespaces="no"/>).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...