将 XML 个节点输出到单个文件中

output XML nodes out into individual files

我正在尝试从 XML 文件的节点创建单个文件。我的问题是,无论我尝试哪种方式,我似乎都陷入了嵌套循环,我要么不断重写每个文件,直到它们一遍又一遍地成为相同的节点数据,要么我 运行 所有节点每个循环实例。我相信这应该很容易,但我在某个地方挂断了电话。

doc = Nokogiri::XML(open("original_copy_mod.xml"))

 doc.xpath("//nodes/node").each do |item| 

      item.xpath("//div[@class='meeting-date']/span/@content").each do |date| 

      date = date.to_s
      split_date = date.split('T00')
      split_date = split_date[0].gsub("-","_")
      split_date = split_date + ".pcf"


       File.open(split_date,'w'){ |f| f.write(item)}
      end 
        
 end

这是我不明白为什么无法创建所有页面的另一种尝试。这只会创建一个页面,但如果我使用“puts”,计数会遍历所有 101 个节点。

 doc = Nokogiri::XML(open("original_copy_mod.xml"))

 doc.xpath("//nodes/node").each do |item| 


      date = item.xpath("//no-name/div[@class='meeting-date']/span/@content").to_s
      split_date = date.split('T00')
      split_date = split_date[0].gsub("-","_")
      split_date = split_date + ".pcf"
      File.open(split_date,'w'){ |f| f.write(item)}
     
        
     end

为了进一步说明,这是我尝试在页面中创建的节点示例。

<?xml version="1.0" encoding="UTF-8" ?>
<nodes>

<node>
    <no-name><div class="meeting-title">Meeting-a</div>
        <div class="meeting-date"><span class="date-display-single" property="dc:date" datatype="xsd:dateTime" content="a-2021-11-29T00:00:00-06:00">Monday, November 29, 2021</span></div>
    </no-name>
    <no-name><div class="past-mtg-icons">
        <div>
            <span><a href="/final.pdf" target="_blank"><img src="agenda-icon.svg"/></a></span>
            <span><a href="final.pdf" target="_blank">Agenda</a></span>
        </div>


        <div>
            <span><a href="https://9949973" target="_blank"><img src="webcast-icon.svg"/></a></span>
            <span><a href="https://9949973" target="_blank">11/29</a></span>
        </div>

        </div>
        <div class="meeting-body"></div></no-name>
</node>

<node>
    <no-name><div class="meeting-title">Meeting-b</div>
        <div class="meeting-date"><span class="date-display-single" property="dc:date" datatype="xsd:dateTime" content="e-2021-09-10T00:00:00-05:00">Friday, September 10, 2021</span></div>
    </no-name>
    <no-name><div class="past-mtg-icons">
        <div>
            <span><a href="/final.pdf" target="_blank"><img src="agenda-icon.svg"/></a></span>
            <span><a href="final.pdf" target="_blank">Agenda</a></span>
        </div>


        <div>
            <span><a href="https://9949973" target="_blank"><img src="webcast-icon.svg"/></a></span>
            <span><a href="https://9949973" target="_blank">11/29</a></span>
        </div>

        </div>
        <div class="meeting-body"></div></no-name>
</node>

<node>
    <no-name><div class="meeting-title">Meeting-c</div>
        <div class="meeting-date"><span class="date-display-single" property="dc:date" datatype="xsd:dateTime" content="f-2021-08-13T00:00:00-05:00">Friday, August 13, 2021</span></div>
    </no-name>
    <no-name><div class="past-mtg-icons">
        <div>
            <span><a href="/final.pdf" target="_blank"><img src="agenda-icon.svg"/></a></span>
            <span><a href="final.pdf" target="_blank">Agenda</a></span>
        </div>


        <div>
            <span><a href="https://9949973" target="_blank"><img src="webcast-icon.svg"/></a></span>
            <span><a href="https://9949973" target="_blank">11/29</a></span>
        </div>

        </div>
        <div class="meeting-body"></div></no-name>
</node>

</nodes>

 

当您使用 w 选项时,它总是重写到文件中。您需要的是创建或追加到文件,这是通过 a 选项完成的。所以你可以试试这个:

File.open(split_date,'a'){ |f| f << item }

PS。确保 split_date 作为文件名对于每个节点都是唯一的,因为您希望每个节点有一个单独的文件

date = item.xpath("//no-name/div[@class='meeting-date']/span/@content").to_s

通过使用//,您将脱离正在迭代的节点的范围。删除斜线可以保留节点的范围。

date = item.xpath("no-name/div[@class='meeting-date']/span/@content").to_s