এক্সএমএল কমান্ড লাইন প্রসেসিংয়ের জন্য গ্রেপ এবং সেড সমতুল্য


147

শেল স্ক্রিপ্টিং করার সময়, সাধারণত সিএসভির মতো একক লাইন রেকর্ডের ফাইলগুলিতে ডেটা থাকবে। grepএবং সহ এই ডেটাটি হ্যান্ডেল করা সত্যিই সহজ sed। তবে আমাকে প্রায়শই এক্সএমএল এর সাথে ডিল করতে হয়, তাই আমি কমান্ড লাইনের মাধ্যমে সেই এক্সএমএল ডেটাতে স্ক্রিপ্ট অ্যাক্সেসের কোনও উপায় চাই। সেরা সরঞ্জাম কি কি?


xml_grep জরিমানা grepping জন্য, যেমন বিবৃত করা হয় stackoverflow.com/a/2222224/871134
Deleplace

উত্তর:


105

এই ধরণের জিনিসটিতে আমি এক্সএমএস স্টারলেটটি বেশ ভাল দেখতে পেয়েছি।

http://xmlstar.sourceforge.net/

বেশিরভাগ ডিস্ট্রো স্টোরগুলিতেও পাওয়া উচিত। একটি সূচনা টিউটোরিয়াল এখানে:

http://www.ibm.com/developerworks/library/x-starlet.html


1
আমি ভেবেছিলাম যে আমি সোর্সফোজের সাইটে উইন্ডোজ বাইনারি উপলব্ধ।
স্টিভ বেনিট

যতদূর আমি বলতে পারি XQuery সমর্থন করে না।
স্টিভ বেনেট

@ স্টেভবেনেট আসলে তা করেন না, তবে এটি কাঁচা এক্সপাথের উপরে যে বৈশিষ্ট্যগুলি যুক্ত করেছে এটি "গ্রেপ এবং সেড" এর সাথে প্রতিযোগিতামূলক করার পক্ষে যথেষ্ট ভাল। আপনি যদি এক্সকিউয়ের অভিনব, অভিনব কল্যাণ চান ... ভাল, এটি পার্ল বা অ্যাজকের সমতুল্য একটি এক্সএমএল এর মতো। :)
চার্লস ডাফি 22

36

কিছু প্রতিশ্রুতিবদ্ধ সরঞ্জাম:

  • নোকোগিরি : এক্সপ্যাথ এবং সিএসএস নির্বাচক ব্যবহার করে রুবিতে এইচটিএমএল / এক্সএমএল ডমগুলি পার্স করা হচ্ছে

  • hpricot : অবচিত

  • fxgrep : ডকুমেন্টগুলি জিজ্ঞাসা করতে নিজস্ব এক্সপথ -জাতীয় সিনট্যাক্স ব্যবহার করে। এসএমএল লিখিত, তাই ইনস্টলেশন কঠিন হতে পারে।

  • এল টি এক্সএমএল : এক্সএমএল টুলকিট সহ যার SGML সরঞ্জাম, থেকে উদ্ভূত sggrep, sgsort, xmlnormএবং অন্যদের। নিজস্ব কোয়েরি সিনট্যাক্স ব্যবহার করে। ডকুমেন্টেশন খুব আনুষ্ঠানিক। সি। এলটি এক্সএমএল 2-এ লিখিত, এক্সপথ, এক্সআইঙ্কেলোড এবং অন্যান্য ডাব্লু 3 সি স্ট্যান্ডার্ডের সমর্থন দাবি করে।

  • xmlgrep2 : এক্সপথ দিয়ে সহজ এবং শক্তিশালী অনুসন্ধান searching এক্সএমএল :: LibXML এবং libxML2 ব্যবহার করে পার্লে লিখিত।

  • এক্সকিউশার্প : এক্সপ্যাথের এক্সটেনশন এক্সকুয়েরিকে সমর্থন করে। .NET ফ্রেমওয়ার্কের জন্য লিখিত

  • xML-coreutils : লেয়ার্ড ব্রায়ার এর টুলকিট জিএনইউ কোর্টিলসের সমতুল্য। আদর্শ টুলকিটটি কী কী অন্তর্ভুক্ত করা উচিত সে সম্পর্কে একটি আকর্ষণীয় প্রবন্ধে আলোচনা করা হয়েছে ।

  • xmldiff : দুটি এক্সএমএল ফাইলের তুলনা করার জন্য সহজ সরঞ্জাম।

  • xmltk : ডিবিয়ান , উবুন্টু, ফেডোরা, বা ম্যাকপোর্টে প্যাকেজ রয়েছে বলে মনে হয় না, 2007 সাল থেকে এটি মুক্তি পায় নি, এবং অ-বহনযোগ্য বিল্ড অটোমেশন ব্যবহার করে।

xML-coreutils সেরা নথিভুক্ত এবং সর্বাধিক ইউনিক্স-ওরিয়েন্টেড বলে মনে হচ্ছে।


1
আপনি কি রুবি প্রোগ্রামের জন্য একটি মোড়ক স্ক্রিপ্ট তৈরি করতে পারেন না, এবং স্ক্রিপ্টে আর্গুমেন্টের অ্যারেতে এইচপ্রিকোটে যেতে পারেন? উদাহরণস্বরূপ, পিএইচপি শেল স্ক্রিপ্টে নীচের মতো কিছু কাজ করা উচিত: <? পিএইচপি / পাথ / টু / এইচপিআরকোট g আরজিভি?>
অ্যালাস্টারস

25

জোসেফ হলস্টেনের দুর্দান্ত তালিকায় আমি এক্সপথ কমান্ড-লাইন স্ক্রিপ্টটি যুক্ত করছি যা পার্ল লাইব্রেরি এক্সএমএল :: এক্সপাথের সাথে আসে। এক্সএমএল ফাইলগুলি থেকে তথ্য আহরণের একটি দুর্দান্ত উপায়:

 xpath -q -e '/entry[@xml:lang="fr"]' *xml

3
এটি অসক্সে ডিফল্টরূপে ইনস্টল করা হয়েছে তবে -q -eবিকল্পগুলি ছাড়াই । উদাহরণস্বরূপ, "অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল" এর "ম্যানিফেস্ট" নোড থেকে "প্যাকেজ" মানটি পান:xpath AndroidManifest.xml 'string(/manifest/@package)' 2> /dev/null
অ্যান্টনজ

25

এছাড়াও আছে xml2এবং 2xmlজুটি। এটি সাধারণ স্ট্রিং এডিটিং সরঞ্জামগুলিকে এক্সএমএল প্রক্রিয়া করার অনুমতি দেবে।

উদাহরণ। q.xml:

<?xml version="1.0"?>
<foo>
    text
    more text
    <textnode>ddd</textnode><textnode a="bv">dsss</textnode>
    <![CDATA[ asfdasdsa <foo> sdfsdfdsf <bar> ]]>
</foo>

xml2 < q.xml

/foo=
/foo=   text
/foo=   more text
/foo=   
/foo/textnode=ddd
/foo/textnode
/foo/textnode/@a=bv
/foo/textnode=dsss
/foo=
/foo=    asfdasdsa <foo> sdfsdfdsf <bar> 
/foo=

xml2 < q.xml | grep textnode | sed 's!/foo!/bar/baz!' | 2xml

<bar><baz><textnode>ddd</textnode><textnode a="bv">dsss</textnode></baz></bar>

দ্রষ্টব্য এছাড়াও রয়েছে html2/ 2html


@ জোসেফ হলস্টেন হ্যাঁ এটি এক্সপ্যাথের জিনিসগুলি না ভেবে এক্সএমএল দিয়ে হ্যাকিংয়ের অনুমতি দেয়।
vi।

নিস! আমি এমন সরঞ্জামগুলিতে ফোকাস করেছিলাম যা কোনও মধ্যবর্তী ফর্ম্যাটটি ব্যবহার করে না, তবে এক্সএমএলটির একটি উচ্চ-বিশ্বস্ততা, লাইন-ভিত্তিক উপস্থাপনার ধারণাটি সত্যিকারের গ্রেপ এবং সেড ব্যবহার চালিয়ে যাওয়ার দুর্দান্ত উপায় বলে মনে হচ্ছে। আপনি কি পাইক্সি চেষ্টা করেছেন? এটি কিভাবে তুলনা করে? অন্য কোন লাইন ভিত্তিক উপস্থাপনা? আপনি কি কোনও সত্তা (& # 10;) দিয়ে এক্সএমএল নিউলাইন প্রতিস্থাপনের চেয়ে এটিকে আরও ভাল বিবেচনা করতে পারেন? এটি আপনাকে কমপক্ষে একই লাইনে রেকর্ডগুলি আটকে দেবে। ওহ, এবং আপনি কি এই প্রকল্পের একটি লিঙ্ক অন্তর্ভুক্ত করতে আপনার পোস্ট সম্পাদনা করতে পারেন?
জোসেফ হলস্টেন

@ জোসেফ হলস্টন নো, পাইক্সি ফর্ম্যাটটি xML2 ফর্ম্যাটের চেয়ে বেশি কার্যকর হবে বলে আমি মনে করি না। xML2 নেস্টেড এক্সএমএল উপাদানগুলিতে "সম্পূর্ণ পথ" সরবরাহ করে, তাই আরও লাইন-ভিত্তিক মিল এবং বিকল্পের জন্য অনুমতি দিন। এছাড়াও 2xmlসহজে আংশিক (ফিল্টার) থেকে এক্সএমএল পুনঃ পারেন xml2আউটপুট।
vi।

5
+1 আমি এটি পর্যাপ্ত পরিমাণে উত্থাপন করতে পারি না ... cat foo.xml | xml2 | grep /bar | 2xml- আপনাকে মূল হিসাবে একই কাঠামো দেয় তবে "বার" উপাদানগুলি বাদ দিয়ে সমস্ত উপাদান ছিনিয়ে নেওয়া হয়েছে। অসাধারণ.
মোগসি

14

আপনি এক্সমিলিন্ট ব্যবহার করতে পারেন:

xmllint --xpath //title books.xml

বেশিরভাগ ডিস্ট্রোসের সাথে বান্ডিল করা উচিত এবং সাইগউইনের সাথেও বান্ডিল করা উচিত।

$ xmllint --version
xmllint: using libxml version 20900

দেখা:

$ xmllint
Usage : xmllint [options] XMLfiles ...
        Parse the XML files and output the result of the parsing
        --version : display the version of the XML library used
        --debug : dump a debug tree of the in-memory document
        ...
        --schematron schema : do validation against a schematron
        --sax1: use the old SAX1 interfaces for processing
        --sax: do not build a tree but work just at the SAX level
        --oldxml10: use XML-1.0 parsing rules before the 5th edition
        --xpath expr: evaluate the XPath expression, inply --noout

2
এখানে কোনও --xpathযুক্তি নেই xmllint: manpagez.com/man/1/xmllint
দুর্বল পরিবর্তনশীল

1
@ দুর্ভাগ্যযোগ্য পরিবর্তনশীল: ম্যান পৃষ্ঠাটি ভুল। আমি কেবল আমার সংস্করণটির জন্য ম্যান পৃষ্ঠাটি দেখেছি: এক্সপথ আর্গুমেন্টটি তালিকাভুক্ত নয়। এটি একটি ডকুমেন্টেশন ত্রুটি। পরিবর্তে প্রোগ্রামটি চালানোর চেষ্টা করুন।
ডেভ জার্ভিস

2
@ মিজেয়ারভেরিয়েবল --xpathএকটি মোটামুটি সাম্প্রতিক সংযোজন এবং উদাহরণস্বরূপ আরএইচইএল 6 এর সংস্করণে নয় xmllint
ড্যানিয়েল বেক

2
আরও সুনির্দিষ্ট হওয়ার জন্য, xmllint --xpathlibxML2 2.7.7 (2010 সালে) এ চালু হয়েছিল।
মারবু

9

আপনি যদি উইন্ডোজে কোনও সমাধান খুঁজছেন, পাওয়ারশেল XML পড়তে এবং লেখার জন্য অন্তর্নির্মিত কার্যকারিতা রাখে।

test.xml:

<root>
  <one>I like applesauce</one>
  <two>You sure bet I do!</two>
</root>

পাওয়ারশেল লিপি:

# load XML file into local variable and cast as XML type.
$doc = [xml](Get-Content ./test.xml)

$doc.root.one                                   #echoes "I like applesauce"
$doc.root.one = "Who doesn't like applesauce?"  #replace inner text of <one> node

# create new node...
$newNode = $doc.CreateElement("three")
$newNode.set_InnerText("And don't you forget it!")

# ...and position it in the hierarchy
$doc.root.AppendChild($newNode)

# write results to disk
$doc.save("./testNew.xml")

testNew.xml:

<root>
  <one>Who likes applesauce?</one>
  <two>You sure bet I do!</two>
  <three>And don't you forget it!</three>
</root>

সূত্র: /server/26976/update-xML-from-the-command-line-windows


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

বাহ, এটি একটি গ্রহণযোগ্য সমাধানের লাইন পর্যন্ত সত্যই টিপটোস। তবে সত্যই, আমি এটির মতো দেখতে চাইলে সম্ভবত এটি গ্রহণ করতাম xps $doc .root.one xps $doc 'AppendChild("three")'এবং xps $doc '.three.set_InnerText("And don't you forget it!")'এটি পরিষ্কারভাবে নিকৃষ্টতর!
জোসেফ হলস্টেন


6

আপনি ঠিক কী করতে চান তার উপর নির্ভর করে।

এক্সএসএলটি যেতে যাওয়ার উপায় হতে পারে, তবে একটি শেখার বক্ররেখা রয়েছে। এক্সস্লটপ্রোক চেষ্টা করে দেখুন এবং আপনি পরামিতিগুলিতে হাত দিতে পারেন তা নোট করুন ।


4

saxon-lintএক্সপ্যাথ ৩.০ / এক্সকিউয়ারি ৩.০ ব্যবহার করার ক্ষমতা সহ কমান্ড লাইন থেকেও রয়েছে । (অন্যান্য কমান্ড-লাইন সরঞ্জামগুলি এক্সপ্যাথ 1.0 ব্যবহার করে)।

উদাহরণ:

HTTP / HTML:

$ saxon-lint --html --xpath 'count(//a)' http://stackoverflow.com/q/91791
328

এক্সএমএল:

$ saxon-lint --xpath '//a[@class="x"]' file.xml

4

ডি বোহদান একটি ওপেন সোর্স গিটহাব রেপো বজায় রাখে যা কাঠামোগত পাঠ্য সরঞ্জামগুলির জন্য কমান্ড লাইন সরঞ্জামগুলির একটি তালিকা রাখে, সেখানে এক্সএমএল / এইচটিএমএল সরঞ্জামগুলির জন্য একটি বিভাগ:

https://github.com/dbohdan/structured-text-tools#xml-html


3

এক্সকিউরি একটি ভাল সমাধান হতে পারে। এটি (তুলনামূলকভাবে) শেখা সহজ এবং একটি ডাব্লু 3 সি স্ট্যান্ডার্ড।

আমি কমান্ড লাইন প্রসেসরের জন্য এক্সকিউশার্পকে সুপারিশ করব


1
বেসএক্সের একটি কমান্ড-লাইন এক্সকুয়েরি প্রসেসর রয়েছে (এটির ডাটাবেস মোড ছাড়াও), এবং স্ট্যান্ডার্ডের রক্তপাত-প্রান্ত সংস্করণগুলি (এক্সকিউরি 3.0 এর বিকশিত খসড়াটি বেশ কাছাকাছিভাবে অনুসরণ করে) সাথে আপ টু ডেট থাকে।
চার্লস ডাফি 22

3

আমি প্রথমে xml স্টারলেট ব্যবহার করেছি এবং এখনও এটি ব্যবহার করছি। কোয়েরিটি শক্ত হয়ে উঠলে আমার এক্সএমএল এর এক্সপথ 2 এবং এক্সকিউরি বৈশিষ্ট্য সমর্থনটি দরকার আমি এক্সিডেলে ফিরে যাই http://www.videlibri.de/xidel.html


1

সমান সমান

আপনি বাশ ফাংশনটি সংজ্ঞায়িত করতে পারেন, "xp" ("xpath") বলুন যা কিছু পাইথন 3 কোডটি মোড় করে। এটি ব্যবহার করতে আপনাকে পাইথন 3 এবং পাইথন-এলএক্সএমএল ইনস্টল করতে হবে। উপকারিতা:

  1. রেজেক্স ম্যাচিং যা আপনার অভাব যেমন উদাহরণস্বরূপ xmllint।
  2. কমান্ডলাইনে ফিল্টার হিসাবে (পাইপেতে) ব্যবহার করুন

এটি ব্যবহার করা সহজ এবং শক্তিশালী:

xmldoc=$(cat <<EOF
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
EOF
)
selection='//*[namespace-uri()="http://www.sample.com/" and local-name()="job" and re:test(.,"^pro.*ing$")]/text()'
echo "$xmldoc" | xp "$selection"
# prints programming

xp () এর মতো কিছু দেখাচ্ছে:

xp()
{ 
local selection="$1";
local xmldoc;
if ! [[ -t 0 ]]; then
    read -rd '' xmldoc;
else
    xmldoc="$2";
fi;
python3 <(printf '%b' "from lxml.html import tostring\nfrom lxml import etree\nfrom sys import stdin\nregexpNS = \"http://exslt.org/regular-expressions\"\ntree = etree.parse(stdin)\nfor e in tree.xpath('""$selection""', namespaces={'re':regexpNS}):\n  if isinstance(e, str):\n    print(e)\n  else:\n    print(tostring(e).decode('UTF-8'))") <<< "$xmldoc"
}

সেড সমতুল্য

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

xmldoc=$(cat <<'EOF'
<resources>
    <string name="app_name">Keep Accounts</string>
    <string name="login">"login"</string>
    <string name="login_password">"password:"</string>
    <string name="login_account_hint">input to login</string>
    <string name="login_password_hint">input your password</string>
    <string name="login_fail">login failed</string>
</resources>
EOF
)
echo "$xmldoc" | xq '.resources.string = ([.resources.string[]|select(."#text" == "Keep Accounts") ."#text" = "Keep Accounts 2"])' -x

-1

জেডিটকে "এক্সকিউয়ারি" নামে একটি প্লাগইন রয়েছে যা এক্সএমএল নথিগুলির জন্য অনুসন্ধান কার্যকারিতা সরবরাহ করে।

বেশ কমান্ড লাইন নয়, তবে এটি কাজ করে!


যদিও জেডিট সম্ভবত কোনও ফাইলের মাধ্যমে অনুসন্ধানের একটি উপায় রয়েছে, এটি এটির প্রতিযোগী করে না grep(1)
জোসেফ হলস্টেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.