Как поместить текст строки без преобразования содержимого в файл XML в Java? - PullRequest
0 голосов
/ 31 марта 2011

Мне нужно поместить содержимое строки в XML на Java. Я использую этот вид кода для вставки информации в XML:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File ("file.xml"));
DOMSource source = new DOMSource (doc);

Node cards = doc.getElementsByTagName ("cards").item (0);

Element card = doc.createElement ("card");
cards.appendChild(card);

Element question = doc.createElement("question");
question.appendChild(doc.createTextNode("This <b>is</b> a test.");
card.appendChild (question);

StreamResult result = new StreamResult (new File (file));
Transformer tf = TransformerFactory.newInstance().newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");
tf.transform(source, result);

Но строка преобразуется в xml следующим образом:

<cards>
  <card>
    <question>This &lt;b&gt;is&lt;/b&gt; a test.</question>
  </card>
</cards>

Должно быть так:

<cards>
  <card>
    <question>This <b>is</b> a test.</question>
  </card>
</cards>

Я пытался использовать метод CDDATA, но код выглядит так:

// I changed this code
question.appendChild(doc.createTextNode("This <b>is</b> a test.");
// to this
question.appendChild(doc.createCDATASection("This <b>is</b> a test.");

Этот код выглядит как XML-файл:

<cards>
  <card>
    <question><![CDATA[This <b>is</b> a test.]]></question>
  </card>
</cards>

Я надеюсь, что кто-нибудь поможет мне поместить содержимое String в файл XML точно с таким же содержимым.

Заранее спасибо!

Ответы [ 5 ]

2 голосов
/ 31 марта 2011

Это было бы ожидаемое поведение.

Подумайте, если бы скобки были сохранены в том виде, в каком вы их поставили, конечный результат будет по существу:

<cards>  
  <card>    
    <question>
      This 
      <b>
        is
      </b>
       a test.
    </question>  
  </card>
</cards>

По сути, это приведет к тому, что <b> будет дополнительным узлом в дереве XML. Кодирование скобок в &lt; и &gt; гарантирует, что при отображении любым анализатором xml скобки будут отображаться, и их не следует путать как дополнительный узел.

Если вы действительно хотели, чтобы они отображались так, как вы говорите, вам нужно будет создать элементы с именем b. Это будет не только неудобно, но и будет отображаться не совсем так, как вы написали выше - оно будет отображаться как дополнительные вложенные узлы, как я показал выше. Таким образом, вам нужно изменить xml Writer для вывода встроенных для этих тегов.

Насти.

1 голос
/ 31 марта 2011

Проверьте это решение: как удалить XML в java

1 голос
/ 31 марта 2011

Может быть, вы могли бы решить это таким образом (код только для <question> части тега):

Element question = doc.createElement("question");
question.appendChild(doc.createTextNode("This ");
Element b = doc.createElement("b");
b.appendChild(doc.createTextNode("is");
question.appendChild(b);
question.appendChild(doc.createTextNode(" a test.");
card.appendChild(question);
0 голосов
/ 31 марта 2011

Или, поскольку вы уже используете Преобразование, почему бы не пройти весь путь?

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output omit-xml-declaration="yes"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="cards">
    <card>
        <question>This <b>is</b> a test</question>
    </card>
</xsl:template>
</xsl:stylesheet>
0 голосов
/ 31 марта 2011

То, что вы фактически пытаетесь сделать, это вставить XML в середину DOM, не анализируя его.Вы не можете сделать это, поскольку DOM API не поддерживают его.

У вас есть три варианта:

  • Вы можете сериализовать DOM и затем вставить строку всоответствующий момент.Конечный результат может быть или не быть правильно сформированным XML ... в зависимости от того, что находится в строке, которую вы вставили.

  • Вы можете создавать и вставлять DOM-узлы, представляющие текст и<b>...</b> элемент.Это требует, чтобы вы знали структуру XML материала, который вы вставляете.Ответ @ bluish приводит пример.

  • Вы можете заключить строку в некоторый элемент контейнера, проанализировать ее с помощью анализатора XML, чтобы получить второй DOM, найти интересующие узлы и добавить их.к оригинальному DOM.Для этого необходимо, чтобы строка была правильно сформирована в формате XML при переносе в элемент контейнера.

...