Преобразуйте Строковый фрагмент XML для Документирования Узла в Java

Для каждого цикла в приложениях логики по умолчанию выполняются его итерации параллельно - поэтому, если вы спроектировали свой рабочий процесс так, чтобы правильная пара имени пользователя и пароля для их соответствующего HTTP POST определялась во время выполнения в каждой итерации на основе оригинальной В порядке сбора начался цикл - вероятно, он произведет поведение, которое вы наблюдаете. Предполагая, что это так, пытались ли вы запустить цикл с опцией Sequential?

https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps- управление поток-петля # последовательной-Еогеасп-петля

72
задан bluish 15 March 2011 в 10:16
поделиться

5 ответов

Element node =  DocumentBuilderFactory
    .newInstance()
    .newDocumentBuilder()
    .parse(new ByteArrayInputStream("<node>value</node>".getBytes()))
    .getDocumentElement();
60
ответ дан user882611 24 November 2019 в 12:41
поделиться

Вы можете использовать метод документа 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);
  }
33
ответ дан McDowell 24 November 2019 в 12:41
поделиться

Для чего стоит, вот решение, которое я придумал, используя библиотеку 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; читайте больше в вопросе, связанном выше.

14
ответ дан 24 November 2019 в 12:41
поделиться

Вот еще одно решение, использующее 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
6
ответ дан 24 November 2019 в 12:41
поделиться

Если вы используете dom4j, вы можете просто сделать:

Document document = DocumentHelper.parseText (text);

(dom4j теперь находится здесь: https: / /github.com/dom4j/dom4j[1155534 impression)

4
ответ дан 24 November 2019 в 12:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: