Для каждого цикла в приложениях логики по умолчанию выполняются его итерации параллельно - поэтому, если вы спроектировали свой рабочий процесс так, чтобы правильная пара имени пользователя и пароля для их соответствующего HTTP POST определялась во время выполнения в каждой итерации на основе оригинальной В порядке сбора начался цикл - вероятно, он произведет поведение, которое вы наблюдаете. Предполагая, что это так, пытались ли вы запустить цикл с опцией Sequential?
Element node = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new ByteArrayInputStream("<node>value</node>".getBytes()))
.getDocumentElement();
Вы можете использовать метод документа import (или принять ) для добавить фрагменты XML:
/**
* @param docBuilder
* the parser
* @param parent
* node to add fragment to
* @param fragment
* a well formed XML fragment
*/
public static void appendXmlFragment(
DocumentBuilder docBuilder, Node parent,
String fragment) throws IOException, SAXException {
Document doc = parent.getOwnerDocument();
Node fragmentNode = docBuilder.parse(
new InputSource(new StringReader(fragment)))
.getDocumentElement();
fragmentNode = doc.importNode(fragmentNode, true);
parent.appendChild(fragmentNode);
}
Для чего стоит, вот решение, которое я придумал, используя библиотеку dom4j . (Я проверил, что это работает.)
Считайте фрагмент XML в org.dom4j.Document
(примечание: все используемые ниже классы XML взяты из org.dom4j; см. Приложение):
String newNode = "<node>value</node>"; // Convert this to XML
SAXReader reader = new SAXReader();
Document newNodeDocument = reader.read(new StringReader(newNode));
Затем получите документ, в который вставлен новый узел, и родительский элемент (который будет) из него. (Ваш org.w3c.dom.Document необходимо будет преобразовать в org.dom4j.Document здесь.) Для целей тестирования я создал такой, как этот:
Document originalDoc =
new SAXReader().read(new StringReader("<root><given></given></root>"));
Element givenNode = originalDoc.getRootElement().element("given");
Добавить новый дочерний элемент очень просто:
givenNode.add(newNodeDocument.getRootElement());
Готово. Вывод originalDoc
теперь дает:
<?xml version="1.0" encoding="utf-8"?>
<root>
<given>
<node>value</node>
</given>
</root>
Приложение : поскольку ваш вопрос говорит о org.w3c.dom.Document
, вот как конвертировать между этой и орг. dom4j. Документ
.
// dom4j -> w3c
DOMWriter writer = new DOMWriter();
org.w3c.dom.Document w3cDoc = writer.write(dom4jDoc);
// w3c -> dom4j
DOMReader reader = new DOMReader();
Document dom4jDoc = reader.read(w3cDoc);
(Если вы Мне нужны оба типа Документа
регулярно, возможно, имеет смысл поместить их в аккуратные служебные методы, может быть, в класс под названием XMLUtils
или что-то в этом роде.)
Может быть, есть Есть лучшие способы сделать это, даже без каких-либо сторонних библиотек. Но из представленных решений, на мой взгляд, это самый простой способ, даже если вам нужно выполнить преобразования dom4j <-> w3c.
Обновление (2011): перед добавлением зависимости dom4j в ваш код , обратите внимание, что это не активно поддерживаемый проект, и есть также некоторые другие проблемы . Усовершенствованная версия 2.0 работала целую вечность, но доступна только альфа-версия. Возможно, вы захотите рассмотреть альтернативу, например, XOM; читайте больше в вопросе, связанном выше.
возможно, имеет смысл поместить их в аккуратные служебные методы, может быть, в класс под названием XMLUtils
или что-то в этом роде.)
Может быть, есть лучшие способы сделать это, даже без каких-либо сторонних библиотек. Но из представленных решений, на мой взгляд, это самый простой способ, даже если вам нужно выполнить преобразования dom4j <-> w3c.
Обновление (2011): перед добавлением зависимости dom4j в ваш код , обратите внимание, что это не активно поддерживаемый проект, и есть также некоторые другие проблемы . Усовершенствованная версия 2.0 работала целую вечность, но доступна только альфа-версия. Возможно, вы захотите рассмотреть альтернативу, например, XOM; читайте больше в вопросе, связанном выше.
возможно, имеет смысл поместить их в аккуратные служебные методы, может быть, в класс под названием XMLUtils
или что-то в этом роде.)
Может быть, есть лучшие способы сделать это, даже без каких-либо сторонних библиотек. Но из представленных решений, на мой взгляд, это самый простой способ, даже если вам нужно выполнить преобразования dom4j <-> w3c.
Обновление (2011): перед добавлением зависимости dom4j в ваш код , обратите внимание, что это не активно поддерживаемый проект, и есть также некоторые другие проблемы . Усовершенствованная версия 2.0 работала целую вечность, но доступна только альфа-версия. Возможно, вы захотите рассмотреть альтернативу, например, XOM; читайте больше в вопросе, связанном выше.
)Может быть, есть лучшие способы сделать это, даже без каких-либо сторонних библиотек. Но из представленных решений, на мой взгляд, это самый простой способ, даже если вам нужно выполнить преобразования dom4j <-> w3c.
Обновление (2011): перед добавлением зависимости dom4j в ваш код , обратите внимание, что это не активно поддерживаемый проект, и есть также некоторые другие проблемы . Усовершенствованная версия 2.0 работала целую вечность, но доступна только альфа-версия. Возможно, вы захотите рассмотреть альтернативу, например, XOM; читайте больше в вопросе, связанном выше.
)Может быть, есть лучшие способы сделать это, даже без каких-либо сторонних библиотек. Но из представленных решений, на мой взгляд, это самый простой способ, даже если вам нужно выполнить преобразования dom4j <-> w3c.
Обновление (2011): перед добавлением зависимости dom4j в ваш код , обратите внимание, что это не активно поддерживаемый проект, и есть также некоторые другие проблемы . Усовершенствованная версия 2.0 работала целую вечность, но доступна только альфа-версия. Возможно, вы захотите рассмотреть альтернативу, например, XOM; читайте больше в вопросе, связанном выше.
Обновление (2011): перед добавлением зависимости dom4j в ваш код, обратите внимание, что это , а не активно поддерживаемый проект, и у него тоже есть некоторые другие проблемы . Усовершенствованная версия 2.0 работала целую вечность, но доступна только альфа-версия. Возможно, вы захотите рассмотреть альтернативу, например, XOM; читайте больше в вопросе, связанном выше.
Обновление (2011): перед добавлением зависимости dom4j в ваш код, обратите внимание, что это , а не активно поддерживаемый проект, и у него тоже есть некоторые другие проблемы . Усовершенствованная версия 2.0 работала целую вечность, но доступна только альфа-версия. Возможно, вы захотите рассмотреть альтернативу, например, XOM; читайте больше в вопросе, связанном выше.
Вот еще одно решение, использующее XOM библиотеку , которое конкурирует с моим ответом dom4j . (Это часть моих поисков хорошей замены dom4j , где XOM был предложен как один из вариантов.)
Сначала прочтите фрагмент XML в nu.xom.Document
:
String newNode = "<node>value</node>"; // Convert this to XML
Document newNodeDocument = new Builder().build(newNode, "");
Затем получите документ и узел, в который добавлен фрагмент. Опять же, в целях тестирования я создам документ из строки:
Document originalDoc = new Builder().build("<root><given></given></root>", "");
Element givenNode = originalDoc.getRootElement().getFirstChildElement("given");
Теперь добавить дочерний узел просто и аналогично dom4j (за исключением того, что XOM не позволяет вам добавить исходный корневой элемент, который уже принадлежит newNodeDocument
):
givenNode.appendChild(newNodeDocument.getRootElement().copy());
Вывод документа дает правильный XML-результат (и это очень просто с XOM: просто распечатайте строку, возвращенную originalDoc. toXML ()
):
<?xml version="1.0"?>
<root><given><node>value</node></given></root>
(Если вы хотите красиво отформатировать XML (с отступами и переводом строки), используйте сериализатор
; спасибо Питеру Штибрани за указание на это.)
Итак, по общему признанию, это не сильно отличается от решения dom4j. :) Однако с XOM может быть немного приятнее работать, потому что API лучше документирован, и из-за его философии дизайна, что существует один канонический способ сделать все.
Приложение : Опять же, вот как это сделать. конвертировать между org.w3c.dom.Document
и nu.xom.Document
. Используйте вспомогательные методы в классе XOM DOMConverter
:
// w3c -> xom
Document xomDoc = DOMConverter.convert(w3cDoc);
// xom -> w3c
org.w3c.dom.Document w3cDoc = DOMConverter.convert(xomDoc, domImplementation);
// You can get a DOMImplementation instance e.g. from DOMImplementationRegistry
Если вы используете dom4j, вы можете просто сделать:
Document document = DocumentHelper.parseText (text);
(dom4j теперь находится здесь: https: / /github.com/dom4j/dom4j[1155534 impression)