无法获取节点
Trouble fetching nodes
我是 XML/Nokogiri 的新手。我正在尝试从其他人生成的 XML 文档中获取具有特定名称的所有节点。文件看起来像:
<taxonomy>
<taxonomy_name>World</taxonomy_name>
<node atlas_node_id = "val">
<node_name></node_name>
<node atlas_node_id = "val>
<node_name></node_name>
<node atlas_node_id = "val">
<node_name></node_name>
</node>
<node atlas_node_id = "val">
<node_name></node_name>
</node>
</node>
<node atlas_node_id = "val">
<node_name></node_name>
</node>
<node atlas_node_id = "val">
<node_name></node_name>
</node>
</node>
</taxonomy>
我想拉取属性为 atlas_node_id
的所有节点。在我的 build_files
方法中,我有以下行:
destinations = tax_file.xpath("//node")
其中 tax_file
之前设置为指向 XML 文件。
上面的 returns 看起来像是文件中的所有节点,如果我尝试将 destinations
设置为 tax_file.xpath("//node_name/node")
,那么我会得到一个空的节点集。有什么方法可以拉取属性为 atlas_node_id
的所有节点?
我浏览了“Searching a XML/HTML Document”,但没有看到任何有用的信息。我错过了一些很明显的东西吗?
更新
在尝试了 haradwaith 和 Alexey Shein 建议的解决方案之后 - 这两种解决方案似乎都将所有节点作为一个大节点获取?在 irb 中测试:
destinations = tax_file.xpath("//node[@atlas_node_id]") (OR)
destinations = tax_file.css('[atlas_node_id]')
d = destinations[0]
d.content
>> \n Africa\n \n South Africa\n \n Cape Town\n \n Table Mountain National Park\n \n \n \n Free State\n \n Bloemfontein\n \n \n \n Gauteng\n \n Johannesburg\n \n \n Pretoria\n \n \n \n KwaZulu-Natal\n \n Durban\n \n \n Pietermaritzburg\n \n \n \n Mpumalanga\n \n Kruger National Park\n \n \n \n The Drakensberg\n \n Royal Natal National Park\n \n \n \n The Garden Route\n \n Oudtshoorn\n \n \n Tsitsikamma Coastal National Park\n \n \n \n\nSudan\n\nEastern Sudan\n\nPort Sudan\n\n\n\nKhartoum\n\n\n\nSwaziland\n\n
我原本希望看到的地方 'Africa'。关于为什么会发生这种情况的任何想法?
您可以在文档中找到 XPath 1.0 syntax 的解释。
要获取具有属性atlas_node_id
的所有节点,您可以这样做:
tax_file.xpath("//node[@atlas_node_id]")
只需使用 []
CSS 选择器:
xml = <<EOD
<taxonomy>
<taxonomy_name>World</taxonomy_name>
<node atlas_node_id = "val">
<node_name>Africa</node_name>
<node atlas_node_id = "val>
<node_name>Capetown</node_name>
</node>
</node>
</taxonomy>
EOD
tax_file = Nokogiri::XML(xml)
nodes = tax_file.css('[atlas_node_id] > node_name')
p nodes.first.text # => "Africa"
您可以在 MDN page 上阅读 CSS 选择器的简短介绍。
哦,看来您不需要属性为 atlas_node_id
的节点本身,而是它们的 <node_name>
个子节点。
上面的代码实际上是find all tags that have an attribute with name "atlas_node_id" and get all his immediate (i.e. 1 level deep) children with tag "node_name"
。
我是 XML/Nokogiri 的新手。我正在尝试从其他人生成的 XML 文档中获取具有特定名称的所有节点。文件看起来像:
<taxonomy>
<taxonomy_name>World</taxonomy_name>
<node atlas_node_id = "val">
<node_name></node_name>
<node atlas_node_id = "val>
<node_name></node_name>
<node atlas_node_id = "val">
<node_name></node_name>
</node>
<node atlas_node_id = "val">
<node_name></node_name>
</node>
</node>
<node atlas_node_id = "val">
<node_name></node_name>
</node>
<node atlas_node_id = "val">
<node_name></node_name>
</node>
</node>
</taxonomy>
我想拉取属性为 atlas_node_id
的所有节点。在我的 build_files
方法中,我有以下行:
destinations = tax_file.xpath("//node")
其中 tax_file
之前设置为指向 XML 文件。
上面的 returns 看起来像是文件中的所有节点,如果我尝试将 destinations
设置为 tax_file.xpath("//node_name/node")
,那么我会得到一个空的节点集。有什么方法可以拉取属性为 atlas_node_id
的所有节点?
我浏览了“Searching a XML/HTML Document”,但没有看到任何有用的信息。我错过了一些很明显的东西吗?
更新
在尝试了 haradwaith 和 Alexey Shein 建议的解决方案之后 - 这两种解决方案似乎都将所有节点作为一个大节点获取?在 irb 中测试:
destinations = tax_file.xpath("//node[@atlas_node_id]") (OR)
destinations = tax_file.css('[atlas_node_id]')
d = destinations[0]
d.content
>> \n Africa\n \n South Africa\n \n Cape Town\n \n Table Mountain National Park\n \n \n \n Free State\n \n Bloemfontein\n \n \n \n Gauteng\n \n Johannesburg\n \n \n Pretoria\n \n \n \n KwaZulu-Natal\n \n Durban\n \n \n Pietermaritzburg\n \n \n \n Mpumalanga\n \n Kruger National Park\n \n \n \n The Drakensberg\n \n Royal Natal National Park\n \n \n \n The Garden Route\n \n Oudtshoorn\n \n \n Tsitsikamma Coastal National Park\n \n \n \n\nSudan\n\nEastern Sudan\n\nPort Sudan\n\n\n\nKhartoum\n\n\n\nSwaziland\n\n
我原本希望看到的地方 'Africa'。关于为什么会发生这种情况的任何想法?
您可以在文档中找到 XPath 1.0 syntax 的解释。
要获取具有属性atlas_node_id
的所有节点,您可以这样做:
tax_file.xpath("//node[@atlas_node_id]")
只需使用 []
CSS 选择器:
xml = <<EOD
<taxonomy>
<taxonomy_name>World</taxonomy_name>
<node atlas_node_id = "val">
<node_name>Africa</node_name>
<node atlas_node_id = "val>
<node_name>Capetown</node_name>
</node>
</node>
</taxonomy>
EOD
tax_file = Nokogiri::XML(xml)
nodes = tax_file.css('[atlas_node_id] > node_name')
p nodes.first.text # => "Africa"
您可以在 MDN page 上阅读 CSS 选择器的简短介绍。
哦,看来您不需要属性为 atlas_node_id
的节点本身,而是它们的 <node_name>
个子节点。
上面的代码实际上是find all tags that have an attribute with name "atlas_node_id" and get all his immediate (i.e. 1 level deep) children with tag "node_name"
。