На протяжении всего обучения программированию Stack Overflow предоставил огромное количество информации и является основным средством обучения тому, как разбираться в разных вещах. Однако для этой проблемы, после поиска в течение нескольких дней и появления с пустыми руками, я решил создать свой первый пост.
Проблема заключается в создании многострочного значения в файле XML из строки java с использованием Xpath Node.setTextContent. Его запись в тег значения в файле XML, который Xpath сообщает как узел элемента. Теперь при записи строкового значения в узел он действительно записывает строковое значение в узел, однако это всего лишь одно длинное строковое значение, поскольку метод setTextContent в соответствии с API ничего не анализирует в строке, а просто записывает текст. . Пример данных, которые я пытаюсь записать: (отредактировано 2-16, только что заметил, что параметр формата не показывает основной пост), отформатированный, как показано ниже, с разбивкой по улице, городскому штату и телефону, как показано ниже ( без пробелов между строками) в соответствии с форматом, указанным в первом примере кода xml.
496 Яркий пр.
Какой-то город, штат, 11111
111-222-3333
Когда строка java записывается в файл xml, она вводится как: 496 Vivid Ave. Some City, State, 11111 111-222-3333.
Пример узла, созданного из родительской программы (не моего java-приложения):
<field sid="ADDRESS">
<itemlocation>
<ae>
<ae>absolute</ae>
<ae>33</ae>
<ae>168</ae>
</ae>
</itemlocation>
<value>496 Vivid Ave.
Some City, State, 11111
111-222-3333</value>
<borderwidth>0</borderwidth>
<fontinfo>
<ae>Times New Roman</ae>
<ae>10</ae>
<ae>plain</ae>
</fontinfo>
<scrollhoriz>wordwrap</scrollhoriz>
<scrollvert>fixed</scrollvert>
<format>
<ae>string</ae>
<ae>optional</ae>
</format>
<acclabel>6. leave address.
enter street, city, state, zip code and phone number.
</acclabel>
<size>
<ae>35</ae>
<ae>3</ae>
</size>
<previous>FIELD5</previous>
<next>ORDINARY</next>
</field>
Когда я запускаю свое приложение, вывод необработанных данных xml выглядит следующим образом:
<field sid="ADDRESS">
<itemlocation>
<ae>
<ae>absolute</ae>
<ae>33</ae>
<ae>168</ae>
</ae>
</itemlocation>
<value>496 Vivid Ave. Some City, State, 11111 111-222-3333</value>
<borderwidth>0</borderwidth>
<fontinfo>
<ae>Times New Roman</ae>
<ae>10</ae>
<ae>plain</ae>
</fontinfo>
<scrollhoriz>wordwrap</scrollhoriz>
<scrollvert>fixed</scrollvert>
<format>
<ae>string</ae>
<ae>optional</ae>
</format>
<acclabel>6. leave address.
enter street, city, state, zip code and phone number.
</acclabel>
<size>
<ae>35</ae>
<ae>3</ae>
</size>
<previous>FIELD5</previous>
<next>ORDINARY</next>
</field>
Я попытался вручную ввести экранированные символы для перевода строки и возврата каретки в строку, и все, что он делает, это вывод значений кода, а не значения.
Поскольку родительская программа читает мой Java-код, она не разбивает адрес и номер телефона на отдельные строки.
Java, которую я использую, выглядит так:
public void setFieldValue(String sid, String value){
Node resultNode = null;
XPath xPath = XPathFactory.newInstance().newXPath();
try{
resultNode = (Node)xPath.evaluate(makeFieldString(sid), doc,XPathConstants.NODE);
}catch(XPathExpressionException xpee){System.out.println(xpee + "Could not retrive node");}
if (resultNode != null){
resultNode.setTextContent(value);
}
else System.out.println("Epic fail");
}
public String makeFieldString(String sid){
String output=null;
if (sid.equals("POPUP2")){
output="//popup[@sid='" + sid + "']/value";
}
else{
output= "//field[@sid='" + sid + "']/value";
}
return output;
}
Если у кого-нибудь есть идеи о том, как заставить строку Java включать разрывы строк, которые распознает setTextContent, я бы это оценил. Я подкинул идею попытаться использовать нормализацию текста и данные о пробелах, но не совсем уверен, как это реализовать, и не уверен, что эти методы в любом случае будут исключены из метода setTextContent.
Спасибо за любую помощь! Я надеюсь, что я был достаточно ясен в своем вопросе, чтобы не поджечь!