শেল থেকে এক্সপ্যাথ ওয়ান-লাইনার কীভাবে কার্যকর করা যায়?


192

উবুন্টু এবং / অথবা সেন্টোস-এর জন্য কি কোনও প্যাকেজ রয়েছে, যার একটি কমান্ড-লাইন সরঞ্জাম রয়েছে যা একটি এক্সপ্যাথ ওয়ান-লাইনারের মতো এক্সিকিউট করতে পারে 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");
}

xpathএক্সএমএল থেকে :: এক্সপথ খুব বেশি শব্দ করে, -- NODE --এবং attribute = "value"

xml_grep এক্সএমএল থেকে :: টুইগ এমন এক্সপ্রেশনগুলিকে পরিচালনা করতে পারে না যা উপাদানগুলি ফেরত দেয় না, সুতরাং আরও প্রক্রিয়াজাতকরণ ছাড়াই বৈশিষ্ট্য মানগুলি বের করতে ব্যবহার করা যাবে না।

সম্পাদনা করুন:

echo cat //element/@attribute | xmllint --shell filename.xmlএকই সাথে শোরগোল ফেরত দেয় xpath

xmllint --xpath //element/@attribute filename.xmlআয় attribute = "value"

xmllint --xpath 'string(//element/@attribute)' filename.xml আমি যা চাই তা ফিরিয়ে দেয় তবে কেবল প্রথম ম্যাচের জন্য।

প্রশ্নটি প্রায় সন্তুষ্ট করার মতো আরও একটি সমাধানের জন্য, এখানে একটি এক্সএসএলটি রয়েছে যা নির্বিচারে এক্সপথ এক্সপ্রেশনগুলি মূল্যায়নের জন্য ব্যবহার করা যেতে পারে (ডিনের প্রয়োজন: এক্সএসএলটি প্রসেসরের সমর্থন মূল্যায়ন করুন):

<?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
মনে রাখবেন যে "শব্দ" xpathSTDERR এ রয়েছে এবং STDOUT নয়।
miken32

@ মিকেন 32 নং আমি আউটপুটটির জন্য কেবল মানটি চেয়েছিলাম। hastebin.com/ekarexumeg.bash
ক্লেক

উত্তর:


271

আপনার এই সরঞ্জামগুলি চেষ্টা করা উচিত:

  • xmlstarlet : সম্পাদনা করতে পারেন, নির্বাচন করতে পারেন, রূপান্তর করতে পারেন ... ডিফল্টরূপে ইনস্টল করা হয়নি, xpath1
  • xmllint: প্রায়শই libxml2-utilsxpath1 দিয়ে ডিফল্টরূপে ইনস্টল করা হয় ( খুব পুরানো রিলিজ এবং নিউলাইনস সীমানা আউটপুট স্যুইচ করতে আমার মোড়ক পরীক্ষা --xpathকরুন (v <2.9.9)
  • xpath: XML::XPathপার্লের মডিউল , xpath1 এর মাধ্যমে ইনস্টল করা
  • xml_grep: XML::Twigপার্লের মডিউল , xpath1 (এক্সপ্যাথের সীমাবদ্ধ ব্যবহারের মাধ্যমে) ইনস্টল করা হয়েছে
  • xidel: এক্সপাথ 3
  • saxon-lint : আমার নিজস্ব প্রকল্প, @ মিশেল কেয়ের স্যাকসন-এইচ জাভা লাইব্রেরি, এক্সপ্যাথ 3 এর উপরে মোড়ক

xmllintসাথে আসে libxml2-utils( --shellস্যুইচ সহ ইন্টারেক্টিভ শেল হিসাবে ব্যবহার করা যেতে পারে )

xmlstarletহয় xmlstarlet

xpath পার্লের মডিউলটি নিয়ে আসে XML::Xpath

xml_grep পার্লের মডিউলটি নিয়ে আসে XML::Twig

xidel হয় xidel

saxon-lintব্যবহার SaxonHE 9.6 , জন্য XPath 3.x (+ + বিপরীতমুখী সামঞ্জস্য)

প্রাক্তন:

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
দ্রষ্টব্য: এক্সএমএল স্টারলেটটি পরিত্যক্ত হওয়ার গুজব ছিল, তবে এখন আবার সক্রিয় বিকাশের অধীনে।
ক্ল্যাক

6
দ্রষ্টব্য: কিছু পুরানো সংস্করণ xmllintকমান্ড লাইন আর্গুমেন্টকে সমর্থন করে না --xpath, তবে বেশিরভাগই সমর্থন করে বলে মনে হচ্ছে --shell। হালকা dirtier আউটপুট, কিন্তু একটি বাঁধাই এখনও দরকারী।
কেভিনারপে

নোডের বিষয়বস্তু অনুসন্ধানের জন্য এখনও আমার সমস্যা হচ্ছে বলে মনে হচ্ছে, কোনও বৈশিষ্ট্য নয়। কেউ কি এর জন্য উদাহরণ দিতে পারে? কোনও কারণে, আমি এখনও ডকুমেন্টের কাঠামো এবং অন্যান্য ইত্যাদির সাথে ম্যাচিং, মান, মূলের মধ্যে সঠিকভাবে খুঁজে পেতে এবং xMLstarlet খুঁজে পেতে অসুবিধা পেয়েছি Even এমনকি sel -t -m ... -v ...এই পৃষ্ঠা থেকে প্রথম উদাহরণ সহ : আর্স্টেক্নিকা / ইনফর্মেশন- টেকনোলজি / ২০০৫ / 11 / লিনাক্স -200111115 / 2 , শেষ নোড ছাড়া সব মিলিয়ে এবং এটি আমার ব্যবহারের মতো মূল্য প্রকাশের জন্য সংরক্ষণ করা, আমি এখনও এটি পেতে পারি না, আমি কেবল ফাঁকা আউটপুট
পাচ্ছি


20

আপনি আমার জিডেলও চেষ্টা করে দেখতে পারেন । এটি সংগ্রহস্থলের কোনও প্যাকেজে নেই তবে আপনি এটি কেবল ওয়েবপৃষ্ঠা থেকে ডাউনলোড করতে পারেন (এটির কোনও নির্ভরতা নেই)।

এটিতে এই কাজের জন্য সহজ বাক্য গঠন রয়েছে:

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

এবং এক্সপ্যাথ 2 সমর্থন করে এমন সরঞ্জামগুলির মধ্যে এটি বিরলগুলির মধ্যে একটি।


2
জিডেল দেখতে খুব সুন্দর দেখাচ্ছে, যদিও আপনার সম্ভবত এটি উল্লেখ করা উচিত যে আপনি যে সরঞ্জামটির পরামর্শ দিচ্ছেন তিনিও তিনি।
হতাশ

1
স্যাকসন এবং স্যাকসন-লিন্ট এক্সপ্যাথ 3;)
গিলস কুইনট

জিডেল (0..8.win32.zip) ভাইরাসটোটলে ম্যালওয়্যার হিসাবে উপস্থিত রয়েছে shows সুতরাং আপনার নিজের ঝুঁকিতে চেষ্টা 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 ফাইলগুলি অনুসন্ধান করার জন্য আমার অনুসন্ধানে আমি এই প্রশ্নটি ছড়িয়ে দিয়েছি। তবে আমার নিম্নলিখিত সীমাবদ্ধতা ছিল:

  • অবশ্যই ক্রস প্ল্যাটফর্ম চালাতে হবে।
  • কোনও অতিরিক্ত মডিউল ইনস্টলেশন ছাড়াই সমস্ত বড় লিনাক্স বিতরণে উপস্থিত থাকতে হবে
  • জটিল xML-ফাইল যেমন maven pom.xML ফাইলগুলি হ্যান্ডেল করতে হবে
  • সাধারণ বাক্য গঠন

আমি উপরোক্ত অনেকগুলি সাফল্য ছাড়াই চেষ্টা করেছি:

  • পাইথন lxML.etree মানক পাইথন বিতরণের অংশ নয়
  • xml.etree তবে জটিল maven pom.xML ফাইলগুলি ভালভাবে পরিচালনা করে না, যথেষ্ট গভীরভাবে খনন করে নি
  • পাইথন xml.etree অজানা কারণে maven pom.xML ফাইল পরিচালনা করে না
  • এক্সমিলিন্ট কোনওভাবেই কাজ করে না, মূল ডাবগুলি প্রায়শই উবুন্টুতে 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
টমজি

10

স্যাকসন এটি এক্সপিথ ২.০-এর জন্যই করবে না, তবে এক্সকিউরি ০.০ এবং (বাণিজ্যিক সংস্করণে) 3.0 এর জন্যও করবে। এটি লিনাক্স প্যাকেজ হিসাবে আসে না, তবে জার ফাইল হিসাবে আসে। সিনট্যাক্স (যা আপনি সহজেই একটি সাধারণ স্ক্রিপ্টে মোড়তে পারেন)

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

2020 আপডেট

স্যাকসন 10.0-এ গিজমো সরঞ্জাম অন্তর্ভুক্ত রয়েছে যা কমান্ড লাইন থেকে ইন্টারেক্টিভ বা ব্যাচে ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ

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

স্যাকসনবি উবুন্টু, প্যাকেজে রয়েছে libsaxonb-java, তবে আমি চালালে saxonb-xquery -qs://element/@attribute -s:filename.xmlআমার SENR0001: Cannot serialize a free-standing attribute nodeযেমন সমস্যা হয় তেমন সমস্যা হয় xml_grep
ক্ল্যাক

3
আপনি যদি এই কোয়েরি দ্বারা নির্বাচিত বৈশিষ্ট্য নোডের পুরো বিশদটি দেখতে চান তবে কমান্ড লাইনে-মোড়ানো বিকল্পটি ব্যবহার করুন। যদি আপনি কেবল গুনটির স্ট্রিং মান চান তবে ক্যোয়ারিতে / স্ট্রিং () যুক্ত করুন।
মাইকেল কে ২

ধন্যবাদ। সংযুক্তকরণ / স্ট্রিং () আরও কাছে আসে। তবে এটি একটি এক্সএমএল শিরোনামকে আউটপুট করে এবং সমস্ত ফলাফলকে এক সারিতে রাখে, সুতরাং এখনও সিগার নেই।
ক্লেক

2
আপনি যদি কোনও এক্সএমএল শিরোনাম না চান তবে বিকল্পটি মেথড = টেক্সট যুক্ত করুন।
মাইকেল কে

নেমস্পেসটি ব্যবহার করতে এটি -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
@ ক্ল্যাক: এটি নয় তবে এটি সিপিএএন থেকে ইনস্টল করা যেতে পারে cpan XML::XSH2
চোরোবা

@ চোরোবা, আমি ওএস এক্স-তে চেষ্টা করেছি, তবে এটি কোনওরকম মেকফিল ত্রুটির সাথে ইনস্টল করতে ব্যর্থ হয়েছিল।
সিএনএস

@ সিএনএসটি: আপনি কি এক্সএমএল :: লিবএক্সএমএল ইনস্টল করেছেন?
চোরোবা

@ চোরোবা, আমি জানি না; তবে আমার বক্তব্যটি হ'ল, cpan XML::XSH2কিছু ইনস্টল করতে ব্যর্থ।
সিএনএস

5

ক্লেকের উত্তর দুর্দান্ত তবে আমি মনে করি কেবলমাত্র যদি আপনার উত্সটি সুসংহত এক্সএমএল হয় তবে সাধারণ এইচটিএমএল নয়।

তাই সাধারণ ওয়েব সামগ্রীর জন্য একই কাজ করতে — এইচটিএমএল ডক্স যা প্রয়োজনীয়ভাবে এক্সএমএল সুগঠিত নয়:

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'))"

এবং পরিবর্তে এইচটিএমএল 5 লিব ব্যবহার করার জন্য (ওয়েব ব্রাউজারগুলির মতো আপনি যেমন পার্সিং আচরণটি পেয়েছেন তা নিশ্চিত করতে — কারণ ব্রাউজার পার্সার্সের মতো, এইচটিএমএল 5 লিবিব এইচটিএমএল স্পেসে পার্সিং প্রয়োজনীয়তার সাথে সম্মত হয়)।

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'))

হ্যাঁ, আমি এই প্রশ্নে আমার নিজের অনুমানের জন্য পড়েছিলাম, এটি এক্সপথটি এক্সএমএলকে বোঝায়। এই উত্তরটি এখানে অন্যদের জন্য একটি ভাল পরিপূরক, এবং html5lib সম্পর্কে আমাকে জানাতে ধন্যবাদ!
ক্লেক

3

মাইকের এবং ক্লেকের উত্তরের অনুরূপ, এখানে পাইম.এক্সএমএল ফাইল থেকে বিল্ড সংস্করণ পেতে পাইথন এক্সএমএল ফাইলগুলি সাধারণত ডিডিটি থাকে না বলে পাইথন ওয়ান-লাইনার (পাইথন> = 2.5 ব্যবহার করে) এখানে রয়েছে or ডিফল্ট নেমস্পেস, সুতরাং 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? এই বিষয়ে সেখানে কী চলছে বা এক্সপাথ কী বলছে তা নিশ্চিত নয় [], তবে @attributeবর্গাকার বন্ধনী সহ একটি ঘিরে রাখা কাজ করে xml_grepএবং xml_grep2
জি সিটো

মানে //element/@attribute, না //element@attribute। আপাতদৃষ্টিতে এটি সম্পাদনা করতে পারে না, তবে এই আলোচনার ইতিহাসকে বিভ্রান্ত না করার জন্য + মুছে ফেলার পরিবর্তে এটি রেখে দেওয়া।
ক্লেক

//element[@attribute]টাইপ নির্বাচন উপাদানের elementএকটি বৈশিষ্ট্য আছে attribute। আমি উপাদানটি চাই না, কেবল গুণাবলী। <element attribute='foo'/>আমাকে দিতে হবে fooপূর্ণ না, <element attribute='foo'/>
ক্লেক

... এবং --text_onlyসেই প্রসঙ্গে আমার <element attribute='foo'/>ভিতরে কোনও পাঠ্য নোড না থাকার মতো উপাদানের ক্ষেত্রে খালি স্ট্রিং দেয় ।
ক্লেক


2

আমি বেশ কয়েকটি কমান্ড লাইন এক্সপাথ ইউটিলিটিগুলি চেষ্টা করেছি এবং যখন আমি বুঝতে পারলাম যে তারা কীভাবে কাজ করে তা গুগলিং এবং সন্ধান করার জন্য আমি খুব বেশি সময় ব্যয় করছি, তাই আমি পাইথনের সহজতম সম্ভাব্য এক্সপথ পার্সার লিখেছিলাম যা আমার প্রয়োজনীয়টি ছিল।

এক্সপথ এক্সপ্রেশনটি কোনও স্ট্রিংয়ের মূল্যায়ন করে যদি ফলাফলটি নোড হয় তবে নীচের স্ক্রিপ্টটি স্ট্রিংয়ের মানটি দেখায় বা পুরো এক্সএমএল সাবনেড দেখায়:

#!/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- সিতে লিখিত একটি দ্রুত এক্সএমএল পার্সার যা মানক পাইথন লাইব্রেরিতে অন্তর্ভুক্ত নয়। এটি দিয়ে ইনস্টল করুন pip install lxml। লিনাক্সে / ওএসএক্সের সাথে উপসর্গের প্রয়োজন হতে পারে sudo

ব্যবহার:

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

lxml ইনপুট হিসাবে কোনও ইউআরএল গ্রহণ করতে পারে:

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

একটি ঘের নোডের অধীনে url বৈশিষ্ট্যটি বের করুন <enclosure url="http:...""..>):

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

গুগল ক্রোমে এক্সপাথ

কোনও সম্পর্কযুক্ত পার্শ্ব নোট হিসাবে: যদি আপনি কোনও ওয়েব পৃষ্ঠার মার্কআপের বিপরীতে এক্সপথ এক্সপ্রেশন চালাতে চান তবে আপনি সরাসরি ক্রোম ডেভোলগুলি থেকে এটি করতে পারেন: ক্রোমে পৃষ্ঠাটি ডান ক্লিক করুন> পরিদর্শন নির্বাচন করুন এবং তারপরে দেবটুলগুলিতে কনসোলটি আপনার এক্সপথ এক্সপ্রেশন হিসাবে আটকান $x("//spam/eggs")

এই পৃষ্ঠায় সমস্ত লেখক পান:

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

নেই একটি এক-লাইনের এবং lxmlইতিমধ্যে উল্লেখ করা হয়েছে দুই অন্যান্য উত্তর পুলিশের সামনে বছর।
ক্ল্যাক

2

এই জাতীয় এক্সএমএল থেকে নেস্টেড উপাদানগুলি থেকে এলেম 1, এলেম 2 থেকে পাঠের এক লাইনে ডেটা উত্তোলনের জন্য একটি এক্সএমএস স্টারলেট ব্যবহারের কেস এখানে রয়েছে (নামস্থান কীভাবে পরিচালনা করতে হয় তাও দেখায়):

<?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

এই স্নিপেটে, -m নেস্টেড এলেম 2 এর সাথে মেলে, -v আউটপুট বৈশিষ্ট্যের মানগুলি (এক্সপ্রেশন এবং আপেক্ষিক সম্বোধনের সাথে), -আর আক্ষরিক পাঠ্যে, -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

নেমস্পেস (এনএস, -N এর সাথে ঘোষিত) সাথে জটিলতার (আইএমও অপ্রয়োজনীয়) নোট করুন, যা আমাকে প্রায় এক্সপ্যাথ এবং এক্সএমএল স্টারলেট ছেড়ে দিয়েছিল এবং দ্রুত অ্যাডহক রূপান্তরকারী লিখেছিল।


এক্সএমএল স্টারলেট দুর্দান্ত, তবে গৃহীত এবং মূল র‌্যাঙ্কিংয়ের উত্তর ইতিমধ্যে এটি উল্লেখ করেছে। নেমস্পেসগুলি কীভাবে পরিচালনা করতে হবে সে সম্পর্কিত তথ্য একটি মন্তব্য হিসাবে প্রাসঙ্গিক হতে পারে all নেমস্পেস এবং এক্সএমএল স্টারলেট নিয়ে যে কোনও সমস্যা নিয়ে চলছে সে দস্তাবেজগুলিতে
ক্লেক

2
অবশ্যই, @ ক্ল্যাক, এক্সএমএল স্টারলেটটি বেশ কয়েকবার উল্লেখ করা হয়েছে, তবে এটি উপলব্ধি করাও শক্ত এবং আন্ডার-ডকুমেন্টেড। আমি ঘন ঘন ধরে অনুমান করছিলাম যে কীভাবে নেস্টেড উপাদানগুলির থেকে তথ্য পাওয়া যায়। আমি আশা করি আমার সেই উদাহরণটি থাকত, তাই অন্যদের যাতে সময় নষ্ট হয় তা এড়াতে আমি এখানে এটি পোস্ট করছি (এবং উদাহরণটি কোনও মন্তব্যের জন্য দীর্ঘ নয়)।
ডায়মো

2

আমার পাইথন স্ক্রিপ্ট xgrep.py ঠিক এটি করে। ফাইলগুলিতে attributeউপাদানগুলির সমস্ত বৈশিষ্ট্যের সন্ধানের জন্য , আপনি এটিকে নিম্নরূপে চালিত করবেন:elementfilename.xml ...

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

আউটপুট নিয়ন্ত্রণের জন্য বিভিন্ন স্যুইচ রয়েছে যেমন -cম্যাচ গণনা, -iমিলের অংশগুলি ইনডেন্টিং এবং -lশুধুমাত্র ফাইলের নাম আউটপুট করার জন্য।

স্ক্রিপ্টটি ডেবিয়ান বা উবুন্টু প্যাকেজ হিসাবে উপলভ্য নয় তবে এর সমস্ত নির্ভরতা।


এবং আপনি সোর্সহটে হোস্টিং করছেন! নিস!
ক্লেক

1

যেহেতু এই প্রকল্পটি আপাতদৃষ্টিতে মোটামুটি নতুন, তাই https://github.com/jeffbr13/xq দেখুন , এটি একটি মোড়ক হিসাবে মনে হচ্ছে lxmlতবে এটিই আপনার সত্যিকারের প্রয়োজন (এবং অন্যান্য উত্তরগুলিতেও lxML ব্যবহার করে অ্যাড-হক সমাধান পোস্ট করেছেন))


1

এইচটিএমএল এক্সপথ প্রশ্নের জন্য পাইথন ওয়ান-লাইনার নিয়ে আমি খুশি ছিলাম না, তাই আমি নিজের লেখা লিখেছি। ধরে নিই যে আপনি 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

ক্যোয়ারী ভাষাটি আসলে এক্সকিয়ার (3.0.০), এক্সপ্যাথ নয়, তবে যেহেতু এক্সকুয়ারি এক্সপ্যাথের সুপারসেট, আপনি কখনও লক্ষ্য না করেই এক্সপ্যাথ অনুসন্ধানগুলি ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.