স্ক্রিপ্টিং: এক্সএমএল ফাইলের একটি ট্যাগের মধ্যে মান বের করা সবচেয়ে সহজ কী?


14

আমি একটি পম.এক্সএমএল (ম্যাভেনের 'প্রজেক্ট অবজেক্ট মডেল') পড়তে এবং সংস্করণটির তথ্য বের করতে চাই। এখানে একটি উদাহরণ:

<?xml version="1.0" encoding="UTF-8"?><project 
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>project-parent</artifactId>
    <name>project-parent</name>
    <version>1.0.74-SNAPSHOT</version>
    <dependencies>
        <dependency>
        <groupId>com.sybase.jconnect</groupId>
        <artifactId>jconnect</artifactId>
        <version>6.05-26023</version>
    </dependency>
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>1.5.2</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jdmk</groupId>
        <artifactId>jmxtools</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.easymock</groupId>
        <artifactId>easymock</artifactId>
        <version>2.4</version>
    </dependency>       
</dependencies>
</project>

উপরে থেকে আমি কীভাবে '1.0.74-SNAPSHOT' সংস্করণটি বের করতে পারি?

সরল বাশ স্ক্রিপ্টিং সেড বা অ্যাজক ব্যবহার করে তা করতে সক্ষম হতে চাই। অন্যথায় একটি সাধারণ অজগর পছন্দ হয়।

সম্পাদনা

  1. বাধ্যতা

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

  2. এক্সএমএল তালিকা আপডেট করা হয়েছে

    আমি মূল তালিকাতে নির্ভরতা ট্যাগ যুক্ত করেছি। এটি দেখায় কিছু হ্যাকি সমাধান এই ক্ষেত্রে কাজ না করে

  3. ডিস্ট্রো

    আমি যে ডিস্ট্রোটি ব্যবহার করছি তা হ'ল RHEL4 4



আসলে তা না. এক্সএমএলে প্রচুর সংস্করণ ট্যাগ রয়েছে (যেমন নির্ভরতা ট্যাগের আওতায়)। আমি কেবল '/ প্রকল্প / সংস্করণ' চাই
অ্যান্থনি কং

কোন এক্সএমএল সম্পর্কিত সরঞ্জাম এবং লাইব্রেরি উপলব্ধ? জেভিএম-ভিত্তিক দ্রাবকগুলি কি ঠিক আছে?
vi।

এখন পর্যন্ত আমি বলতে পারি xML2, xMLgrep এবং পার্ল এক্সএমএল মডিউল উপস্থিত নেই। বেশিরভাগ ইউনিক্স কমান্ড-লাইন ইউটিলিটি উপস্থিত রয়েছে। ডিস্ট্রোটি রেডহ্যাট EL 4
অ্যান্টনি কং

(আমি একটি মন্তব্য তাই আমি একটি উত্তর হিসাবে উত্তর করতে হবে না যোগ করতে পারি, Overkill কিছুটা) কেউ কেউ মহান উত্তর পাওয়া যাবে এখানে ..... stackoverflow.com/questions/2735548/...
JStrahl

উত্তর:


17

xML2 xML / লাইন-ভিত্তিক ফর্ম্যাট থেকে রূপান্তর করতে পারে:

xml2 < pom.xml  | grep /project/version= | sed 's/.*=//'

6

অন্য উপায়: এক্সএমএলগ্রিপ এবং এক্সপথ:

xmlgrep --text_only '/project/version' pom.xml

অসুবিধা: ধীর


কমান্ড আপডেট হয়েছেxml_grep
GAD3R

6

ব্যবহার python

$ python -c 'from xml.etree.ElementTree import ElementTree; print ElementTree(file="pom.xml").findtext("{http://maven.apache.org/POM/4.0.0}version")'
1.0.74-SNAPSHOT

ব্যবহার xmlstarlet

$ xml sel -N x="http://maven.apache.org/POM/4.0.0" -t -m 'x:project/x:version' -v . pom.xml
1.0.74-SNAPSHOT

ব্যবহার xmllint

$ echo -e 'setns x=http://maven.apache.org/POM/4.0.0\ncat /x:project/x:version/text()' | xmllint --shell pom.xml | grep -v /
1.0.74-SNAPSHOT

cat (//x:version)[1]/text()ব্যবহার করার xmllintসময়ও কাজ করে!
কেভ

5

ক্লোজার উপায় বিশেষ জার ফাইল সহ কেবল jvm প্রয়োজন:

java -cp clojure.jar clojure.main -e "(use 'clojure.xml) (->> (java.io.File. \"pom.xml\") (clojure.xml/parse) (:content) (filter #(= (:tag %) :version)) (first) (:content) (first) (println))"

স্কেল উপায়:

java -Xbootclasspath/a:scala-library.jar -cp scala-compiler.jar scala.tools.nsc.MainGenericRunner -e 'import scala.xml._; println((XML.load(new java.io.FileInputStream("pom.xml")) match { case <project>{children @ _*}</project> => for (i <- children if (i  match { case <version>{children @ _*}</version> => true; case _ => false;  }))  yield i })(0) match { case <version>{Text(x)}</version> => x })'

গ্রোভি উপায়:

java -classpath groovy-all.jar groovy.ui.GroovyMain -e 'println (new XmlParser().parse(new File("pom.xml")).value().findAll({ it.name().getLocalPart()=="version" }).first().value().first())'

এটা সত্যিই দারুন! ভালো বুদ্ধি!
অ্যান্থনি কং

4

পার্লের এখানে একটি বিকল্প রয়েছে

$ perl -MXML::Simple -e'print XMLin("pom.xml")->{version}."\n"'
1.0.74-SNAPSHOT

এটি বিভিন্ন গভীরতায় একাধিক "সংস্করণ" উপাদান রয়েছে এমন প্রশ্নের সংশোধিত / বর্ধিত উদাহরণ সহ কাজ করে।


ধীর, (যদিও এক্সএমগ্রগ্রের চেয়ে দ্রুত)
vi।

3

হ্যাকি উপায়:

perl -e '$_ = join "", <>; m!<project[^>]*>.*\n(?:    |\t)<version[^>]*>\s*([^<]+?)\s*</version>.*</project>!s and print "$1\n"' pom.xml

প্রয়োজনীয় সঠিক ইন্ডেন্টেশন উপর নির্ভর করে <version>


পরামর্শের জন্য ধন্যবাদ, তবে দুর্ভাগ্যক্রমে এটি আমার যা চাইবে তা ফিরে পাবে না। দয়া করে আপডেট করা পোম মডেলটি দেখুন।
অ্যান্টনি কং

"1.0.74-SNAPSHOT" প্রদান করে। নোট করুন যে আমি একাধিক <version>জিনিস পড়ার পরে স্ক্রিপ্ট পরিবর্তন করেছি।
vi।

দ্রষ্টব্য: এই সমাধানটি "কেবল মজাদার জন্য" সরবরাহ করা হয়েছে এবং এটি আসল পণ্যটিতে ব্যবহারের উদ্দেশ্যে নয়। এক্সএমএল 2 / এক্সএমএলগ্রিপ / এক্সএমএল আরও ভাল ব্যবহার করুন: সহজ সমাধান।
vi।

ধন্যবাদ! যদিও এটি 'কেবল মজাদার জন্য' তবে এটি সম্ভবত 'সবচেয়ে উপযুক্ত' সমাধান কারণ এটির ন্যূনতম নির্ভরতা রয়েছে: এটি কেবল পার্লের প্রয়োজন ;-)
অ্যান্থনি কং

জাভা থেকে এটি সম্পর্কে কি? পম ফাইল ব্যবহারের অর্থ জেভিএম ইনস্টল থাকা।
vi।

3

খুব আনাড়ি, ওয়ান-লাইনারের সমাধানটি তৈরি করুন

python -c "from xml.dom.minidom import parse;dom = parse('pom.xml');print [n for n in dom.getElementsByTagName('version') if n.parentNode == dom.childNodes[0]][0].toxml()" | sed -e "s/.*>\(.*\)<.*/\1/g"

শেষে সেডটি খুব কুরুচিপূর্ণ তবে আমি একা মাইন্ডোম দিয়ে নোডের পাঠ্য মুদ্রণ করতে সক্ষম হই নি।

_ভি থেকে আপডেট :

কম হ্যাকি পাইথন সংস্করণ:

python -c "from xml.dom.minidom import parse;dom = parse('pom.xml');print [i.childNodes.item(0).nodeValue for i in dom.firstChild.childNodes if i.nodeName == 'version'].pop()"

আমার কাছ থেকে আপডেট

অন্য সংস্করণ:

    python -c "from  xml.dom.minidom import parse;dom = parse('pom.xml');print [n.firstChild.data for n in dom.childNodes[0].childNodes if n.firstChild and n.tagName == 'version']"

2

এক্সএসএলটি উপায়:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text"/>

        <xsl:template match="/">
                <xsl:for-each select="*[local-name()='project']">
                    <xsl:for-each select="*[local-name()='version']">
                        <xsl:value-of select="text()"/>
                    </xsl:for-each>
                </xsl:for-each>
        </xsl:template>
</xsl:stylesheet>
xalan -xsl x.xsl -in pom.xml

যদি xsltproc আপনার সিস্টেমে থাকে এবং এটি সম্ভবত libxslt যেমন RHEL4 তে থাকে তবে আপনি ট্যাগটি আউটপুট দেওয়ার জন্য এটি এবং উপরের স্টাইলশিটটি ব্যবহার করতে পারেন, xsltproc x.xsl prom.xsl।
এফএমপুরফি

2

যদি "এক্সএমএলে প্রচুর সংস্করণ ট্যাগ থাকে" তবে আপনি "সাধারণ সরঞ্জাম" এবং রিজেক্সপস দিয়ে এটি করা ভাল করে ভুলে যাবেন না।

এই অজগরটি চেষ্টা করুন (কোনও নির্ভরতা নেই):

from xml.dom.minidom import parse

dom = parse('pom.xml')
project = dom.getElementsByTagName('project')[0]
for node in project.childNodes:
    if node.nodeType == node.ELEMENT_NODE and node.tagName == 'version':
        print node.firstChild.nodeValue

এই লিপিটি ঠিক কী করে?
সাইমন শিহান

পাইথনের মিনিডোম বাস্তবায়ন ব্যবহার করে এটি এক্সএমএলকে একটি ডিওএম কাঠামো হিসাবে লোড করে: ডকস.পিথথন.আর.লিবারি / এক্সএমএল.মোমিনিডম এইচটিএমএল ধারণাটি অনন্য যা <প্রকল্প> ট্যাগটি ধরবে এবং তারপরে তার শিশু নোডের উপর পুনরাবৃত্তি করবে (সরাসরি কেবলমাত্র শিশুদের জন্য) <version> ট্যাগটি আমরা খুঁজেছি যা অন্য জায়গাতে একই নামের সাথে অন্য ট্যাগ নয় find
সামুস_২২

1

সেড ব্যবহার করে এখানে একটি ওয়ান-লাইনার দেওয়া হয়েছে:

sed '/<dependencies>/,/<\/dependencies>/d;/<version>/!d;s/ *<\/\?version> *//g' pom.xml

1
উপাদানগুলিতে প্যারামিটারের অভাবের উপর নির্ভর করে এবং অতিরিক্ত অতিরিক্ত <version>কেবল নির্ভরতার মধ্যে থাকতে পারে।
vi।

1

কোন অতিরিক্ত সরঞ্জাম ব্যবহার না করে awk সূক্ষ্মভাবে কাজ করে।
cat pod.xml

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.networks.app</groupId>
  <artifactId>operation-platform</artifactId>
  <version>1.0.0</version>
  <packaging>tar.xz</packaging>
  <description>POM was created by Sonatype Nexus</description>
</project>

<packaging>ট্যাগের মান পাওয়ার সহজ এবং সুস্পষ্ট উপায় :

cat pod.xml | awk -F'[<>]' '/packaging/{print $3}'

1
এটি কাজ করে বলে মনে হচ্ছে তবে সাবধান থাকুন: এটি যা করে তা হল ক্ষেত্র বিভাজক (এফএস) অক্ষরের সেটকে সেট করে <এবং>; তারপরে এটি "প্যাকেজিং" শব্দটির সাথে সমস্ত লাইন খুঁজে পায় এবং আপনাকে তৃতীয় ক্ষেত্র দেয় give
স্মারিল

0
Return_text_val=$(xmllint --xpath "//*[local-name()='$TagElmnt']" $FILE )

এখানে, এটি চেষ্টা করুন:

$TagElmnt - TagName
$FILE - xml file to parse

0

আমি জানি আপনার প্রশ্নটি লিনাক্স বলছে তবে আপনার যদি কোনও তৃতীয় পক্ষের সরঞ্জামের প্রয়োজন মতো উইন্ডোজে এটি করার প্রয়োজন হয় যা আপনি এটি একটি ব্যাচের ফাইলে রাখতে পারেন, পাওয়ারশেল আপনার পম.এমএমএল ফাইল থেকে কোনও নোড বের করতে পারে :

powershell -Command "& {select-xml //pom:project/pom:properties/pom:mypluginversion -path pom.xml -Namespace  @{pom='http://maven.apache.org/POM/4.0.0'} | foreach {$_.Node.Innerxml}}" > myPluginVersion.txt

পাওয়ারশেল এখন ওপেন সোর্স এবং লিনাক্স এবং অন্যান্য প্ল্যাটফর্মগুলিতে চালিত হয়। আমরা এটি ব্যাশ, সাইগউইন এবং মিং 64 এর অগ্রাধিকারে বিল্ডিংয়ের জন্য ব্যবহার করি।
চার্লওয়েড

0
sed -n "/<name>project-parent/{n;s/.*>\(.*\)<.*/\1/p;q}" pom.xml

-nবিকল্প মুদ্রণ অ ম্যাচিং লাইন এড়াতে; /.../ওয়ান্টেড টেক্সট সহ প্রথম ম্যাচটি ( ) লাইনে রয়েছে; nকমান্ড পরের লাইনে, এর অগ্রাহ্য যেখানে sএকটি ক্যাপচারিং গ্রুপ পুরনো নির্যাস প্রাসঙ্গিক তথ্য ( \(...\)), এবং একটি backreference ( \1)। pপ্রিন্ট আউট, qপ্রস্থান।


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