Основная проблема на самом деле довольно проста: я не могу заставить Nokogiri DocumentFragment вести себя так, как ожидалось. Он имеет два узла, а не тот, который он имел бы, если бы это был фактический документ, и он не распознает этот узел как элемент, а документ.Проблемы с вставкой элементов в фрагмент XML
Мне нужен фрагмент вместо документа, потому что я хочу вставить полученный XML в другой документ (или фрагмент) в качестве элемента. Похоже, я использовал метод неправильного фрагмента.
Я пытаюсь создать представление XML для объектов в нашем приложении Ruby on Rails в методе build_xml. Поскольку у меня есть иерархия вложенных объектов, я делаю ее универсальным методом, который будет использоваться между классами, и используйте константу класса в каждом классе для обработки информации, относящейся к классу. Каждый объект создает Nokogiri DocumentFragment вместо полного документа, так что любая возвращаемая строка XML может быть вставлена в XML-объект содержащего объекта в качестве элемента.
Моя проблема в том, что я не могу получить фрагмент, чтобы показать мне его элементы. Итак, у меня есть:
xml_string = self.to_xml({skip_types:true, skip_instruct: true}) # Use default to_xml method to get started
xml_fragment = Nokogiri::XML::DocumentFragment.parse(xml_string) # Create Nokogiri doc fragment
И в этот момент, я хочу, чтобы цикл по каждому вложенному объекту и добавить его в качестве вложенного элемента только элемента фрагмента. Тем не менее, метод element_children() этого фрагмента возвращает пустой массив, в то время как метод children() возвращает массив из двух элементов, первым из которых является элемент, который я хочу, а вторым из них является некоторый текстовый объект, содержащий только строку ,
Пример:
df = Datafile.first
xml_string = df.to_xml({skip_types:true, skip_instruct: true})
frag = Nokogiri::XML::DocumentFragment.parse(xml_string)
frag.element_children # => returns []
frag.children # => returns array of two children, one of which is datafile element, the other of which is just a linefeed.
Если я создаю фактический XML-документ, а не только фрагмент, то документ имеет element_children заселенные, как и ожидалось, и, кроме того, doc.children имеет только один элемент, без во-вторых, избыточный узел. Я мог бы попытаться выполнить мою работу с документом, а затем просто преобразовать его в фрагмент, прежде чем возвращать его, но я не знаю, будет ли возникающий фрагмент по-прежнему иметь проблемы, и я бы предпочел понять, что происходит, поэтому я могу просто сделайте это правильно, вместо этого.
Итак ...
- Почему не фрагмент признают его единственный реальный узел как элемент? Есть ли что-то, что я должен сделать, чтобы заставить это? Документация Nokogiri не описывает много о узлах элементов, но похоже, что у них нет доступных свойств, чтобы отличать их от общих узлов.
- Почему этот второй, пустой узел появляется, когда я разбираю фрагмент?
- Должен ли я просто пройти через полные документы? Есть ли простой способ сделать документ для фрагмента?
- Должен ли я делать это совсем по-другому?
Добро пожаловать в переполнение стека. Трудно представить, что вы описываете. Stack Overflow ожидает минимальный пример вашего входного XML, а также код, демонстрирующий проблему, и пример вашего желаемого результата. См. Раздел «Помогите другим воспроизвести проблему» в разделе «[ask]». –
Не нужно извиняться за недостающую информацию, но мы не можем подчеркнуть, насколько важно предоставить нам необходимую информацию. Без этого мы угадываем и стреляем в темноте, что только задерживает получение рабочего решения для вас и расстраивает нас. Кроме того, при добавлении дополнительной информации, не помещайте ее в начале или в конце вопроса и пометьте ее «Изменить» или «Обновить». Мы можем видеть изменения/обновления, и добавленная информация должна быть включена в вопрос, где вы бы добавили ее изначально, поэтому она имеет смысл и читается правильно. –
Кроме того, помните, что минимальные примеры кода и данных LOT более полезны, чем страницы объяснения. Объяснение помогает определить намерение, но код показывает нам путь, который вы берете, чтобы добраться туда. Как рисунок, примеры стоят 1000 слов. –