2010-08-25 5 views
0

Я использую xstream в java 1.4, и у меня возникла проблема с некоторыми встроенными xml в элементах.Элемент XML, содержащий другие символы xml, заменен с помощью xstream

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

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

привет элемент данных является строкой, содержавшийся в тегах SwiftMessage. Я вижу, что Xstream видит их и заменяет их

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

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

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

ответ

0

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

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

Оно должно быть:

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

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

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

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

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

2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^