Трансформатор CDATA_SECTION_ELEMENTS изменить мой контент XML - PullRequest
0 голосов
/ 11 июня 2018

У меня есть этот код:

Transformer transformer1 = TransformerFactory.newInstance().newTransformer();
final DOMResult domResult = new DOMResult();
marshaller.marshal(objectForMarshall, domResult);
transformer1.setOutputProperty(OutputKeys.INDENT, "yes");
transformer1.setOutputProperty(
        OutputKeys.CDATA_SECTION_ELEMENTS,
        "Parameters");
transformer1.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer1.transform(new DOMSource(domResult.getNode()), new StreamResult(new FileOutputStream("D:\\1.xml")));

В objectForMarshall есть поле типа байтов массива.Содержимое этого я хочу поместить в раздел CDATA.

У меня есть этот адаптер:

public class CDATAAdapter extends XmlAdapter<String, byte[]> {

    @Override
    public String marshal(byte[] v) throws Exception {
        return new String(v);
    }

    @Override
    public byte[] unmarshal(String v) throws Exception {
        return v.getBytes();
    }

} 

После преобразования в окончательном файле я получаю содержимое в CDATA, которое разделено новой строкой:

<ConditionInstance ActionConditionComponent="Regular" Id="1026">
      <Parameters><![CDATA[<regular_condition>

  <union type="AND">

    <operation allow_absent_property="false" type="BIGGER">

      <left>

        <Entity item="value" property="DateTo" type="datetime"/>

      </left>

      <right>

        <Entity item="value" property="DateTo" type="datetime"/>

      </right>

    </operation>

  </union>

</regular_condition>

]]></Parameters>
    </ConditionInstance>

Почему это происходит, я не могу понять?Как это можно исправить?Почему преобразователь изменяет содержимое моего контента?

Если я удаляю:

transformer1.setOutputProperty(
            OutputKeys.CDATA_SECTION_ELEMENTS,
            cDataTagName);

Новые строки не добавляются !!!

<ConditionInstance ActionConditionComponent="Regular" Id="1026">
      <Parameters>&lt;regular_condition&gt;&#13;
  &lt;union type="AND"&gt;&#13;
    &lt;operation allow_absent_property="false" type="BIGGER"&gt;&#13;
      &lt;left&gt;&#13;
        &lt;Entity item="value" property="DateTo" type="datetime"/&gt;&#13;
      &lt;/left&gt;&#13;
      &lt;right&gt;&#13;
        &lt;Entity item="value" property="DateTo" type="datetime"/&gt;&#13;
      &lt;/right&gt;&#13;
    &lt;/operation&gt;&#13;
  &lt;/union&gt;&#13;
&lt;/regular_condition&gt;&#13;
</Parameters>
    </ConditionInstance>

1 Ответ

0 голосов
/ 11 июня 2018

Я предполагаю, что значением элемента Parameters является строка, содержащая пары символов CRLF (x13 x10).

Когда вы сериализуете это напрямую, CR сериализуется как ссылка на символ &#13;, иNL сериализуется как фактическая новая строка.

Когда вы сериализуете его как часть раздела CDATA, CRLF сериализуется в виде двух символов: x13, за которым следует x10;и любое программное обеспечение, которое вы используете для отображения результатов, показывает это как две строки, а не как один.

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