มีแพ็คเกจออกมาสำหรับ Ubuntu และ / หรือ CentOS ที่มีเครื่องมือบรรทัดคำสั่งที่สามารถใช้ XPath แบบหนึ่งบรรทัดเหมือนfoo //element@attribute filename.xml
หรือfoo //element@attribute < filename.xml
และส่งคืนผลลัพธ์ทีละบรรทัดได้หรือไม่
ฉันกำลังมองหาบางสิ่งบางอย่างที่จะทำให้ฉันเป็นapt-get install foo
หรือแค่yum install foo
นั้นก็ทำงานนอกกรอบไม่มีการห่อหุ้มหรือการดัดแปลงอื่น ๆ ที่จำเป็น
นี่คือตัวอย่างของสิ่งที่เข้ามาใกล้:
Nokogiri ถ้าฉันเขียน wrapper นี้ฉันสามารถเรียก wrapper ตามวิธีที่อธิบายไว้ข้างต้น:
#!/usr/bin/ruby
require 'nokogiri'
Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
puts row
end
XML :: XPath จะทำงานกับ wrapper นี้:
#!/usr/bin/perl
use strict;
use warnings;
use XML::XPath;
my $root = XML::XPath->new(ioref => 'STDIN');
for my $node ($root->find($ARGV[0])->get_nodelist) {
print($node->getData, "\n");
}
xpath
จาก XML :: XPath ผลตอบแทนที่เสียงดังมากเกินไปและ-- NODE --
attribute = "value"
xml_grep
จาก XML :: Twig ไม่สามารถจัดการกับนิพจน์ที่ไม่ส่งคืนองค์ประกอบดังนั้นจึงไม่สามารถใช้เพื่อแยกค่าแอตทริบิวต์โดยไม่มีการประมวลผลเพิ่มเติม
แก้ไข:
echo cat //element/@attribute | xmllint --shell filename.xml
xpath
ผลตอบแทนที่เสียงคล้ายกับ
xmllint --xpath //element/@attribute filename.xml
attribute = "value"
ผลตอบแทน
xmllint --xpath 'string(//element/@attribute)' filename.xml
ส่งคืนสิ่งที่ฉันต้องการ แต่เฉพาะในนัดแรก
สำหรับโซลูชันอื่นเกือบตอบสนองคำถามนี่คือ XSLT ที่สามารถใช้เพื่อประเมินนิพจน์ XPath โดยพลการ (ต้องการ dyn: ประเมินการสนับสนุนในโปรเซสเซอร์ XSLT):
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:dyn="http://exslt.org/dynamic" extension-element-prefixes="dyn">
<xsl:output omit-xml-declaration="yes" indent="no" method="text"/>
<xsl:template match="/">
<xsl:for-each select="dyn:evaluate($pattern)">
<xsl:value-of select="dyn:evaluate($value)"/>
<xsl:value-of select="' '"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml
ทำงานด้วย
xpath
อยู่ใน STDERR ไม่ใช่ STDOUT