कैसे खोल से XPath एक-liners निष्पादित करने के लिए?


192

क्या उबंटू और / या सेंटोस के लिए कोई पैकेज है, जिसमें एक कमांड-लाइन टूल है जो XPath वन-लाइनर को निष्पादित कर सकता है foo //element@attribute filename.xmlया foo //element@attribute < filename.xmlलाइन द्वारा परिणाम पंक्ति को वापस कर सकता है?

मैं एक ऐसी चीज की तलाश कर रहा हूं, जो मुझे सिर्फ apt-get install fooया yum install fooफिर सिर्फ आउट-ऑफ-द-बॉक्स, कोई रैपर या अन्य अनुकूलन करने की अनुमति देती है।

यहाँ चीजों के कुछ उदाहरण हैं जो करीब आते हैं:

Nokogiri। अगर मैं इस रैपर को लिखता हूं तो मैं ऊपर वर्णित तरीके से रैपर को कॉल कर सकता हूं:

#!/usr/bin/ruby

require 'nokogiri'

Nokogiri::XML(STDIN).xpath(ARGV[0]).each do |row|
  puts row
end

एक्सएमएल :: XPath। इस आवरण के साथ काम करेंगे:

#!/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");
}

xpathXML से: 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="'&#10;'"/>
    </xsl:for-each> 
  </xsl:template>
</xsl:stylesheet>

के साथ भागो xsltproc --stringparam pattern //element/@attribute --stringparam value . arbitrary-xpath.xslt filename.xml


+1 अच्छे प्रश्न के लिए और एक सरल और विश्वसनीय तरीका खोजने के बारे में बुद्धिशीलता के लिए प्रत्येक को एक नई
पंक्ति में

1
ध्यान दें कि "शोर" xpathSTDERR पर है न कि STDOUT पर।
miken32

@ miken32 नहीं। मैं केवल आउटपुट के लिए मूल्य चाहता था। hastebin.com/ekarexumeg.bash
clacke

जवाबों:


271

आपको इन उपकरणों को आज़माना चाहिए:

  • xmlstarlet : संपादित कर सकते हैं, चयन कर सकते हैं, बदल सकते हैं ... डिफ़ॉल्ट रूप से स्थापित नहीं, xpath1
  • xmllint: अक्सर डिफ़ॉल्ट रूप से स्थापित किया जाता है libxml2-utils, xpath1 (मेरे पुराने आवरण पर --xpathस्विच करने के लिए बहुत पुराने रिलीज़ और नए सिरे से सीमांकित आउटपुट (v <2.9.9) की जाँच करें)
  • xpath: पर्ल के मॉड्यूल के माध्यम से स्थापित XML::XPath, xpath1
  • xml_grep: पर्ल के मॉड्यूल के माध्यम से स्थापित XML::Twig, xpath1 (सीमित xpath उपयोग)
  • xidel: xpath3
  • saxon-lint : मेरा अपना प्रोजेक्ट, @Michael Kay की Saxon-HE Java लाइब्रेरी, xpath3 पर आवरण

xmllintके साथ आता है libxml2-utils( --shellस्विच के साथ इंटरैक्टिव शेल के रूप में इस्तेमाल किया जा सकता है )

xmlstarletहै xmlstarlet

xpath पर्ल के मॉड्यूल के साथ आता है XML::Xpath

xml_grep पर्ल के मॉड्यूल के साथ आता है XML::Twig

xidel है xidel

saxon-lint का उपयोग करते हुए SaxonHE 9.6 , XPath 3.x (+ रेट्रो अनुकूलता)

Ex:

xmllint --xpath '//element/@attribute' file.xml
xmlstarlet sel -t -v "//element/@attribute" file.xml
xpath -q -e '//element/@attribute' file.xml
xidel -se '//element/@attribute' file.xml
saxon-lint --xpath '//element/@attribute' file.xml


7
अति उत्कृष्ट! xmlstarlet sel -T -t -m '//element/@attribute' -v '.' -n filename.xmlबिल्कुल वही करता है जो मैं चाहता हूँ!
क्लैके

2
नोट: xmlstarlet को छोड़ने की अफवाह थी, लेकिन अब फिर से सक्रिय विकास के तहत है।
क्लैक

6
नोट: कुछ पुराने संस्करण xmllintकमांड लाइन तर्क का समर्थन नहीं करते हैं --xpath, लेकिन अधिकांश समर्थन करते हैं --shell। थोड़ा डर्टियर आउटपुट, लेकिन अभी भी एक बाँध में उपयोगी है।
केविनरपे

मुझे अभी भी नोड सामग्री के लिए क्वेरी करने में कठिनाई हो रही है, कोई विशेषता नहीं है। क्या कोई इसके लिए एक उदाहरण प्रदान कर सकता है? किसी कारण से, मुझे अभी भी xmlstarlet का पता लगाना मुश्किल है और मिलान, मूल्य, रूट के बीच दस्तावेज़ संरचना को देखने के लिए सही है, और आदि .. यहां तक ​​कि sel -t -m ... -v ...इस पृष्ठ से पहले उदाहरण के साथ : arstechnica.com/information-technology/2005 / 11 / linux-20051115/2 , सभी मिलान, लेकिन पिछले नोड और मेरे उपयोग के मामले की तरह मूल्य अभिव्यक्ति के लिए एक को बचाने, मैं अभी भी इसे पाने के लिए प्रतीत नहीं कर सकता, मैं बस खाली उत्पादन मिलता है ..
Pysis

xpath के संस्करण पर एक अच्छा - मैं सिर्फ अन्यथा उत्कृष्ट xmllint की इस सीमा में
चलाऊंगा

20

तुम भी मेरे Xidel की कोशिश कर सकते हो । यह रिपॉजिटरी में एक पैकेज में नहीं है, लेकिन आप इसे वेबपेज से डाउनलोड कर सकते हैं (इसमें कोई निर्भरता नहीं है)।

इस कार्य के लिए इसका सरल वाक्य विन्यास है:

xidel filename.xml -e '//element/@attribute' 

और यह इन उपकरणों में से एक है जो XPath 2 का समर्थन करता है।


2
Xidel बहुत अच्छा लग रहा है, हालांकि आपको शायद यह उल्लेख करना चाहिए कि आप इस उपकरण के लेखक भी हैं, जिसे आप सुझाते हैं।
FrustratedWithFormsDesigner

1
सैक्सन और सैक्सन-लिंट xpath3 का उपयोग करते हैं;)
गिल्स क्वेनोट सेप

Xidel (0..8.win32.zip) से पता चलता है कि विरूस्तोटल पर मैलवेयर है। तो अपने स्वयं के जोखिम पर प्रयास करें virustotal.com/#/file/…
JGFMK

महान - मैं अपने व्यक्तिगत रिंच टूल बॉक्स में xidel जोड़ने जा रहा हूं
maoizm

15

एक पैकेज जो पहले से ही एक सिस्टम पर स्थापित होने की बहुत संभावना है python-lxml। यदि ऐसा है, तो यह किसी भी अतिरिक्त पैकेज को स्थापित किए बिना संभव है:

python -c "from lxml.etree import parse; from sys import stdin; print '\n'.join(parse(stdin).xpath('//element/@attribute'))"

1
फाइलन कैसे पास करें?
रामकृष्णन कन्नन

4
इस पर काम करता है stdin। यह शामिल है open()और close()पहले से ही काफी लंबे वन-लाइनर की आवश्यकता को समाप्त करता है । किसी फ़ाइल को बस चलाने के लिए python -c "from lxml.etree import parse; from sys import stdin; print '\n'.join(parse(stdin).xpath('//element/@attribute'))" < my_file.xmlऔर अपने शेल को फ़ाइल देखने, खोलने और बंद करने की सुविधा दें।
जक

10

Maven pom.xml फ़ाइलों की क्वेरी करने के लिए मेरी खोज में मैं इस प्रश्न के पार गया। हालाँकि मेरी निम्नलिखित सीमाएँ थीं:

  • क्रॉस-प्लेटफ़ॉर्म चलाना चाहिए।
  • किसी भी अतिरिक्त मॉड्यूल की स्थापना के बिना सभी प्रमुख लिनक्स वितरण पर मौजूद होना चाहिए
  • मावेन pom.xml फ़ाइलों जैसे जटिल xml- फ़ाइलों को संभालना चाहिए
  • सरल वाक्यविन्यास

मैंने सफलता के बिना उपरोक्त कई प्रयास किए हैं:

  • अजगर lxml.etree मानक अजगर वितरण का हिस्सा नहीं है
  • xml.etree है, लेकिन अच्छी तरह से गहरी खुदाई नहीं की है, जटिल मावेन pom.xml फ़ाइलों को संभाल नहीं करता है
  • python xml.etree अज्ञात कारण से maven pom.xml फ़ाइलों को संभालता नहीं है
  • xmllint या तो काम नहीं करता है, ubuntu 12.04 पर कोर डंप अक्सर "xmllint: libxml संस्करण 20708" का उपयोग कर रहा है

जो समाधान मैं भर में आया हूं वह स्थिर है, छोटा है और कई प्लेटफार्मों पर काम करता है और जो परिपक्व है, वह है माणिक में रेक्सामिल लिबास।

ruby -r rexml/document -e 'include REXML; 
     puts XPath.first(Document.new($stdin), "/project/version/text()")' < pom.xml

मुझे यह खोजने के लिए किसने प्रेरित किया, यह निम्नलिखित लेख था:


1
यह सवाल से भी संकीर्ण मानदंड है, इसलिए यह निश्चित रूप से एक जवाब के रूप में फिट बैठता है। मुझे यकीन है कि आपके शोध में भाग लेने वाले कई लोगों को आपके शोध से मदद मिलेगी। मैं xmlstarletस्वीकृत उत्तर के रूप में रख रहा हूं , क्योंकि यह मेरे व्यापक मानदंडों को फिट करता है और यह वास्तव में साफ-सुथरा है । लेकिन मैं समय-समय पर आपके समाधान के लिए उपयोग करूंगा।
क्लैक

2
मुझे लगता है कि परिणाम के चारों ओर उद्धरण से बचने के लिए , रूबी कमांड के putsबजाय का उपयोग करें p
TomG

10

सैक्सन न केवल XPath 2.0 के लिए, बल्कि XQuery 1.0 और (व्यावसायिक संस्करण में) 3.0 के लिए भी ऐसा करेगा। यह लिनक्स पैकेज के रूप में नहीं, बल्कि जार फ़ाइल के रूप में आता है। सिंटेक्स (जिसे आप सरल लिपि में आसानी से लपेट सकते हैं) है

java net.sf.saxon.Query -s:source.xml -qs://element/attribute

2020 अद्यतन

सैक्सन 10.0 में Gizmo टूल शामिल है, जिसका उपयोग अंतःक्रियात्मक रूप से या कमांड लाइन से बैच में किया जा सकता है। उदाहरण के लिए

java net.sf.saxon.Gizmo -s:source.xml
/>show //element/@attribute
/>quit

SaxonB उबंटू में है, पैकेज libsaxonb-java, लेकिन अगर मैं चलाता saxonb-xquery -qs://element/@attribute -s:filename.xmlहूं तो मुझे SENR0001: Cannot serialize a free-standing attribute nodeवही समस्या है, जैसे कि xml_grep
क्लैक

3
यदि आप इस क्वेरी द्वारा चयनित विशेषता नोड का पूरा विवरण देखना चाहते हैं, तो कमांड लाइन पर -wrap विकल्प का उपयोग करें। यदि आप विशेषता का स्ट्रिंग मान चाहते हैं, तो क्वेरी में / string () जोड़ें।
माइकल काय

धन्यवाद। जोड़ना / स्ट्रिंग () करीब हो जाता है। लेकिन यह एक XML हेडर को आउटपुट करता है और सभी परिणामों को एक पंक्ति में रखता है, इसलिए अभी भी कोई सिगार नहीं है।
क्लैक

2
यदि आप XML हेडर नहीं चाहते हैं, तो विकल्प जोड़ें! विधि = पाठ।
माइकल काय

नेमस्पेस का उपयोग करने के लिए इसे -qsइस तरह से जोड़ें :'-qs:declare namespace mets="http://www.loc.gov/METS/";/mets:mets/mets:dmdSec'
igo

5

आपको xsh में भी रुचि हो सकती है । इसमें एक इंटरेक्टिव मोड है जहाँ आप दस्तावेज़ के साथ जो चाहें कर सकते हैं:

open 1.xml ;
ls //element/@id ;
for //p[@class="first"] echo text() ;

यह पैकेज के रूप में उपलब्ध नहीं लगता है, कम से कम उबंटू में नहीं है।
क्लैके

1
@clacke: यह नहीं है, लेकिन इसे CPAN से इंस्टॉल किया जा सकता है cpan XML::XSH2
कोरोबा

@choroba, मैंने कोशिश की है कि OS X पर, लेकिन यह स्थापित करने में विफल रहा, किसी प्रकार की मेकफाइल त्रुटि के साथ।
cnst

@cnst: क्या आपके पास XML :: LibXML स्थापित है?
चोरोबा

@choroba, मुझे नहीं पता; लेकिन मेरी बात यह है कि, cpan XML::XSH2कुछ भी स्थापित करने में विफल रहता है।
cnst

5

क्लैके का जवाब बहुत अच्छा है लेकिन मुझे लगता है कि केवल तभी काम होता है जब आपका स्रोत एक्सएमएल हो, सामान्य एचटीएमएल नहीं।

सामान्य वेब सामग्री के लिए ऐसा ही करने के लिए- HTML डॉक्स जो जरूरी अच्छी तरह से गठित XML नहीं हैं:

echo "<p>foo<div>bar</div><p>baz" | python -c "from sys import stdin; \
from lxml import html; \
print '\n'.join(html.tostring(node) for node in html.parse(stdin).xpath('//p'))"

और इसके बजाय html5lib का उपयोग करने के लिए (यह सुनिश्चित करने के लिए कि आपको वेब ब्राउज़र के समान पार्सिंग व्यवहार मिलता है - क्योंकि ब्राउज़र पार्सर की तरह, HTML5lib HTML कल्पना में पार्सिंग आवश्यकताओं के अनुरूप है)।

echo "<p>foo<div>bar</div><p>baz" | python -c "from sys import stdin; \
import html5lib; from lxml import html; \
doc = html5lib.parse(stdin, treebuilder='lxml', namespaceHTMLElements=False); \
print '\n'.join(html.tostring(node) for node in doc.xpath('//p'))

हां, मैं इस प्रश्न में अपनी खुद की धारणा के लिए गिर गया, कि XPath का तात्पर्य XML है। यह उत्तर यहां दूसरों के लिए एक अच्छा पूरक है, और मुझे html5lib के बारे में बताने के लिए धन्यवाद!
4

3

माइक और क्लैके के जवाबों के समान, यहाँ एक pom.xml फ़ाइल से बिल्ड वर्जन प्राप्त करने के लिए अजगर वन-लाइनर (python> = 2.5 का उपयोग करना) है जो इस तथ्य के आसपास मिलता है कि pom.xml फ़ाइल सामान्य रूप से dtd या नहीं है डिफ़ॉल्ट नाम स्थान, इसलिए libxml का अच्छी तरह से गठन नहीं दिखाई देता है:

python -c "import xml.etree.ElementTree as ET; \
  print(ET.parse(open('pom.xml')).getroot().find('\
  {http://maven.apache.org/POM/4.0.0}version').text)"

मैक और लिनक्स पर परीक्षण किया गया है, और किसी भी अतिरिक्त पैकेज को स्थापित करने की आवश्यकता नहीं है।


2
मैंने आज इसका इस्तेमाल किया! हमारे बिल्ड सर्वर के पास न तो lxmlऔर न ही xmllintरूबी था। अपने स्वयं के उत्तर में प्रारूप की भावना में , मैंने इसे python3 -c "from xml.etree.ElementTree import parse; from sys import stdin; print(parse(stdin).find('.//element[subelement=\"value\"]/othersubelement').text)" <<< "$variable_containing_xml"बैश के रूप में लिखा । .getroot()आवश्यक नहीं लगता है।
क्लैके

2

के अलावा एक्सएमएल :: XSH और एक्सएमएल :: XSH2 वहाँ कुछ कर रहे हैं grepकी तरह उपयोगिताओं के रूप में चूसना App::xml_grep2और XML::Twig(जो भी शामिल है xml_grepके बजाय xml_grep2)। त्वरित ऑनलाइनर या Makefileलक्ष्य के लिए बड़ी या कई एक्सएमएल फाइलों पर काम करते समय ये काफी उपयोगी हो सकते हैं । जब आप अपने प्रस्ताव और प्रस्ताव की तुलना में थोड़ा अधिक प्रसंस्करण करना चाहते हैं, तो स्क्रिप्टिंग दृष्टिकोण के XML::Twigलिए काम करना विशेष रूप से अच्छा है ।perl$SHELLxmllint xstlproc

एप्लिकेशन नामों में नंबरिंग योजना इंगित करती है कि "2" संस्करण अनिवार्य रूप से उसी उपकरण के नए / बाद के संस्करण हैं, जिन्हें बाद में अन्य मॉड्यूल (या perlखुद के) के संस्करणों की आवश्यकता हो सकती है ।


xml_grep2 -t //element@attribute filename.xmlकाम करता है और जो मैं उससे उम्मीद करता हूं ( xml_grep --root //element@attribute --text_only filename.xmlअभी भी नहीं करता है, वह "गैर-मान्यता प्राप्त अभिव्यक्ति" त्रुटि देता है)। महान!
क्लैक

किस बारे में xml_grep --pretty_print --root '//element[@attribute]' --text_only filename.xml? यकीन नहीं है कि वहाँ क्या हो रहा है या XPath []इस मामले में क्या कहता है , लेकिन आसपास के @attributeसाथ वर्ग कोष्ठक के लिए काम करता है xml_grepऔर xml_grep2
जीटो

मेरा मतलब है //element/@attribute, नहीं //element@attribute। इसे जाहिरा तौर पर संपादित नहीं किया जा सकता है, लेकिन इस चर्चा के इतिहास को भ्रमित न करने के लिए इसे हटाएं + बदलें के बजाय इसे वहां छोड़ दें।
1948

//element[@attribute]elementउस प्रकार के तत्वों का चयन करता है जिसमें एक विशेषता है attribute। मुझे तत्व नहीं चाहिए, केवल विशेषता है। <element attribute='foo'/>मुझे देना चाहिए foo, पूर्ण नहीं <element attribute='foo'/>
क्लैके

... और --text_onlyउस संदर्भ में मुझे तत्व के मामले में खाली स्ट्रिंग मिलती है जैसे <element attribute='foo'/>कोई पाठ नोड अंदर नहीं है।
क्लैक


2

मैंने कमांड लाइन XPath उपयोगिताओं के एक जोड़े की कोशिश की है और जब मुझे एहसास हुआ कि मैं बहुत अधिक समय गुगली कर रहा हूं और यह पता लगा रहा हूं कि वे कैसे काम करते हैं, इसलिए मैंने पायथन में सबसे सरल संभव XPath पार्सर लिखा जो मुझे चाहिए था।

नीचे दी गई स्क्रिप्ट स्ट्रिंग मान को दिखाती है यदि XPath अभिव्यक्ति एक स्ट्रिंग का मूल्यांकन करता है, या यदि परिणाम नोड के अनुसार पूरे XML सबनोड को दिखाता है:

#!/usr/bin/env python
import sys
from lxml import etree

tree = etree.parse(sys.argv[1])
xpath = sys.argv[2]

for e in tree.xpath(xpath):

    if isinstance(e, str):
        print(e)
    else:
        print((e.text and e.text.strip()) or etree.tostring(e))

यह उपयोग करता है lxml- सी में लिखा गया एक तेज XML पार्सर जो मानक अजगर पुस्तकालय में शामिल नहीं है। इसके साथ स्थापित करें pip install lxml। Linux / OSX पर उपसर्ग की आवश्यकता हो सकती हैsudo

उपयोग:

python xmlcat.py file.xml "//mynode"

lxml एक URL को इनपुट के रूप में भी स्वीकार कर सकता है:

python xmlcat.py http://example.com/file.xml "//mynode" 

संलग्नक नोड के अंतर्गत url विशेषता निकालें <enclosure url="http:...""..>):

python xmlcat.py xmlcat.py file.xml "//enclosure/@url"

Google Chrome में Xpath

एक असंबंधित साइड नोट के रूप में: यदि संयोग से आप किसी वेब पेज के मार्कअप के खिलाफ एक्सपीथ एक्सप्रेशन चलाना चाहते हैं तो आप इसे सीधे क्रोम devtools से कर सकते हैं: क्रोम> सेलेक्ट इंस्पेक्ट, और फिर DevTools में पेज को राइट-क्लिक करें कंसोल अपने XPath की अभिव्यक्ति पेस्ट करें $x("//spam/eggs")

इस पृष्ठ पर सभी लेखकों को प्राप्त करें:

$x("//*[@class='user-details']/a/text()")

एक-लाइनर नहीं, और तुम्हारा पहले से lxmlही दो अन्य उत्तर में उल्लेख किया गया था ।
क्लैके

2

इस प्रकार के XML से पाठ की एक पंक्ति के लिए नेस्टेड तत्वों elem1, elem2 से डेटा निकालने के लिए यहां एक xmlstarlet उपयोग मामला है (यह भी दिखा कि नामस्थान कैसे संभालना है):

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<mydoctype xmlns="http://xml-namespace-uri" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xml-namespace-uri http://xsd-uri" format="20171221A" date="2018-05-15">

  <elem1 time="0.586" length="10.586">
      <elem2 value="cue-in" type="outro" />
  </elem1>

</mydoctype>

आउटपुट होगा

0.586 10.586 cue-in outro

इस स्निपेट में, मैं नेस्टेड एलएम 2 से मेल खाता है, -v आउटपुट एट्रिब्यूट वैल्यूज (एक्सप्रेशन और रिलेटिव एड्रेसिंग के साथ), -o शाब्दिक टेक्स्ट के साथ -n एक न्यूलाइन जोड़ता है:

xml sel -N ns="http://xml-namespace-uri" -t -m '//ns:elem1/ns:elem2' \
 -v ../@time -o " " -v '../@time + ../@length' -o " " -v @value -o " " -v @type -n file.xml

अगर एलएम 1 से अधिक विशेषताओं की आवश्यकता होती है, तो कोई इसे इस तरह भी कर सकता है (कंकट को दिखाते हुए भी)

xml sel -N ns="http://xml-namespace-uri" -t -m '//ns:elem1/ns:elem2/..' \
 -v 'concat(@time, " ", @time + @length, " ", ns:elem2/@value, " ", ns:elem2/@type)' -n file.xml

नामस्थानों (ns, -N के साथ घोषित) के साथ IMO अनावश्यक) जटिलता पर ध्यान दें, जो मुझे लगभग xpath और xmlstarlet पर दे रहा था, और एक त्वरित तदर्थ कनवर्टर लिख रहा था।


xmlstarlet महान है, लेकिन स्वीकृत और मुख्य रैंकिंग उत्तर में पहले से ही इसका उल्लेख है। नाम स्थान को कैसे संभालना है, इस बारे में जानकारी शायद एक टिप्पणी के रूप में प्रासंगिक रही हो। नामस्थान और xmlstarlet के साथ मुद्दों पर चलने वाले किसी भी व्यक्ति को प्रलेखन में
1849 बजे क्लैक

2
ज़रूर, @clacke, xmlstarlet का उल्लेख कई बार किया गया है, लेकिन यह भी कि इसे समझ पाना कठिन है, और अविकसित है। मैं लगभग एक घंटे के लिए अनुमान लगा रहा था कि कैसे नेस्टेड तत्वों से जानकारी प्राप्त की जाए। काश मेरे पास वह उदाहरण होता, इसीलिए मैं इसे यहां पोस्ट कर रहा हूं ताकि दूसरों को समय की हानि से बचाया जा सके (और उदाहरण एक टिप्पणी के लिए बहुत लंबा है)।
20

2

मेरा पायथन लिपि xgrep.py बिल्कुल यही करता है। फ़ाइलों में attributeतत्वों की सभी विशेषताओं की खोज करने के लिए , आप इसे निम्नानुसार चलाएंगे:elementfilename.xml ...

xgrep.py "//element/@attribute" filename.xml ...

आउटपुट को नियंत्रित करने के लिए विभिन्न स्विच होते हैं, जैसे कि -cमैच की गिनती के -iलिए, मिलान वाले हिस्सों को इंडेंट करने के लिए, और-l लिए केवल फ़ाइल नाम के आउटपुट के लिए।

स्क्रिप्ट डेबियन या उबंटू पैकेज के रूप में उपलब्ध नहीं है, लेकिन इसकी सभी निर्भरताएं हैं।


और आप sourcehut पर होस्ट कर रहे हैं! अच्छा!
नाका

1

चूंकि यह प्रोजेक्ट स्पष्ट रूप से काफी नया है, इसलिए https://github.com/jeffbr13/xq देखें , लगता है कि यह एक आवरण है lxml, लेकिन यह आपको वास्तव में चाहिए (और अन्य उत्तरों में भी lxml का उपयोग करके तदर्थ समाधान पोस्ट किया गया है)


1

मैं HTML XPath प्रश्नों के लिए पायथन वन-लाइनर्स से खुश नहीं था, इसलिए मैंने अपना लिखा। मान लें कि आपने python-lxmlपैकेज स्थापित किया है या भागा है pip install --user lxml:

function htmlxpath() { python -c 'for x in __import__("lxml.html").html.fromstring(__import__("sys").stdin.read()).xpath(__import__("sys").argv[1]): print(x)' $1 }

एक बार आपके पास होने के बाद, आप इसका उपयोग इस उदाहरण में कर सकते हैं:

> curl -s https://slashdot.org | htmlxpath '//title/text()'
Slashdot: News for nerds, stuff that matters

0

बेसएक्स डेटाबेस स्थापित करें , फिर इसका उपयोग "स्टैंडअलोन कमांड-लाइन मोड" की तरह करें:

basex -i - //element@attribute < filename.xml

या

basex -i filename.xml //element@attribute

क्वेरी भाषा वास्तव में XQuery (3.0) है, XPath नहीं है, लेकिन चूंकि XQuery XPath का सुपरसेट है, आप XPath प्रश्नों का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.