Элемент XML, содержащий другие символы xml, замененные с использованием xstream - PullRequest
0 голосов
/ 25 августа 2010

Я использую xstream в Java 1.4, и у меня возникла проблема с некоторыми встроенными XML в элементах.

У меня следующее сообщение:

<detail>
<SwiftMessage><SWIFT>hi<SWIFT/><SwiftMessage/>
<detail/>

Данные элементаhi - это строка, содержащаяся в тегах SwiftMessage.Я вижу, что Xstream видит их и заменяет на

&lt;SWIFT&gt;hi&lt;SWIFT/&gt;

, иначе он создает недопустимый xml.То, что я хочу знать, есть ли способ заключить в кавычки эту строку, чтобы препятствовать тому, чтобы xstream сделал это.Это часть сообщения JMS, которое отправляется в другую систему, и им не понравятся замены.

Очень ценю любые мысли по этому поводу.

Ответы [ 2 ]

2 голосов
/ 29 октября 2012

Как указал Джеймс, ваш встроенный XML не является правильно закрытым, но главное: любой XML-API должен избегать встроенного XML, чтобы предотвратить структурные изменения в формате XML, то есть встроенный XML является и должен интерпретироваться как простойтекстовый узел для предотвращения «внедрения XML».

Если я правильно понимаю, причина проблемы в том, что процессы отправки и получения не симметричны: вы send( XStream.toXML( JMS.xml() ) ), а затем receive( JMS.xml() ).Если вы измените процедуру получения на receive( XStream.fromXML( JMS.xml() ) ), тогда XStream.fromXML() проанализирует XML, вернув встроенный XML из «экранированного» в «исходный».

0 голосов
/ 16 января 2011

Это подлинный пример вашего XML? Ваш тег закрывается неправильно

<detail>
<SwiftMessage><SWIFT>hi<SWIFT/><SwiftMessage/>
<detail/>

Должно быть:

<detail>
<SwiftMessage><SWIFT>hi</SWIFT></SwiftMessage>
</detail>

Обратная косая черта в конце имени элемента означает, что элемент пустой, как тег html br: <br/>

Итак, ваш XML говорит: открыть тег детализации, открыть тег SwiftMessage, открыть тег SWIFT, текст hi, добавить пустой тег SWIFT, добавить пустой тег SwiftMessage, добавить пустой тег подробностей. Теги на самом деле не закрываются.

Я предполагаю, что получающее приложение ожидает элемент SWIFT в качестве действительного XML, а не строки? Возможно, вам придется показать, как вы добавляете элемент SWIFT. Если вы введете его в значение элемента SwiftMessage, оно, вероятно, будет интерпретировано как строковое значение, при этом ваш XML-процессор автоматически заменит < на &lt; и > на &gt;, поскольку эти символы зарезервированы для конструирования элементов. .

В противном случае, если вы хотите, чтобы элемент SWIFT рассматривался как строковое значение, вам необходимо использовать раздел CDATA.

...