Nokogiri检查XML元素是否具有子节点

时间:2017-05-16 08:52:43

标签: ruby xml nokogiri

给出类似于:

的XML结构
echo mv

使用Ruby和nokogiri如何迭代节点并检查子元素是否是另一个元素或文本节点?

基本上,如果子节点是另一个元素,我需要修改我对输出的处理,而不是它只是一个文本节点。

我需要在不知道密钥名称的情况下这样做。

作为一个例子,如果我检查密钥名称(因为我知道它有一个子元素),我可以完全按照我想要的那样做,但是这需要是通用的而不是数据特定的。

这是我通过检查密钥名称所拥有的:

<homes>
    <home>
        <name>home 1</name>
    </home>
    <home>
        <name>home 2</name>
    </home>
</homes>
<flats>
    <flat>Flat 1</flat>
</flats>

我试图避免使用这个:repeatingElements = [] nodes.each do |element| case element when Nokogiri::XML::Element child_content = map_content(element.children, {}) if element.name === 'home' repeatingElements << { element.name => child_content } content_hash = repeatingElements else content_hash[element.name] = child_content unless child_content.empty? end when Nokogiri::XML::Text return element.content end end content_hash end 和实际数据一样,我可能不知道密钥名称。

1 个答案:

答案 0 :(得分:-1)

为什么你不能尝试更简单的方法, 基于您的示例x​​ml doc,此伪代码必须正常工作.EVERY'Nokogiri :: XML :: ELEMENT'有一个名为'next_element'的方法,您可以通过以下方式利用该方法

xml_doc.elements.each do |ele| #iterate over children in the doc" ele.children.each do |child_ele| #check if the next element belongs to nokogiri text class unless child_ele.next_element.class == 'Nokogiri::XML::Text' #do something with child_elements which are not text else #do something with text element end end end