/ / एक्सएमएल पार्सर का उपयोग कर एक्सएमएल तत्व से मूल्य प्राप्त करें और इसे एक चर - xml, shell, xslt को असाइन करें

XML पार्सर का उपयोग करके एक्सएमएल तत्व से मूल्य प्राप्त करें और इसे एक चर - xml, shell, xslt को असाइन करें

मेरे पास निम्नलिखित एक्सएमएल है:

        <?xml version="1.0" encoding="utf-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>BundleResourceDeploy</groupId>
<artifactId>Project3</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>sbar</packaging>
<description></description>
</project>

इसके अलावा मेरे पास निम्न XSLT स्टाइलशीट है:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://maven.apache.org/POM/4.0.0" exclude-result-prefixes="ns">

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="ns:project">


<xsl:element name="ns:groupId">
<xsl:value-of select="ns:groupId"/>
</xsl:element>

<xsl:element name="ns:artifactId">
<xsl:value-of select="ns:artifactId"/>
</xsl:element>

<xsl:element name="ns:version">
<xsl:value-of select="ns:version"/>
</xsl:element>

<xsl:element name="ns:packaging">
<xsl:value-of select="ns:packaging"/>
</xsl:element>

</xsl:template>
</xsl:stylesheet>

आदेश निष्पादित: xsltproc "स्टाइलशीट" "xml_file"> output.xml

आउटपुट (output.xml फ़ाइल की सामग्री) है:

<ns:groupId xmlns:ns="http://maven.apache.org/POM/4.0.0">BundleResourceDeploy</ns:groupId><ns:artifactId xmlns:ns="http://maven.apache.org/POM/4.0.0">Project2</ns:artifactId><ns:version xmlns:ns="http://maven.apache.org/POM/4.0.0">1.0-SNAPSHOT</ns:version><ns:packaging xmlns:ns="http://maven.apache.org/POM/4.0.0">sbar</ns:packaging>

मैं जो हासिल करना चाहता हूं वह है: एक शेल स्क्रिप्ट में मैं तत्व "groupId" का मान प्राप्त करना चाहता हूं, जो "बंडल संसाधन संसाधन" होगा, और इसे एक चर के लिए असाइन करेगा।

क्या आप इसे हासिल करने के तरीके से मेरी मदद कर सकते हैं?

उत्तर:

जवाब के लिए 0 № 1

व्यक्तिगत रूप से, मैं XMLStarlet का उपयोग करता हूं:

#!/bin/bash
#      ^^^^-- NOT /bin/sh; process substitution is an extension in ksh and bash
#             $"" literal syntax is an extension as well, likewise read -d

IFS=$"n" read -r -d "" groupId artifactId version packaging < <(
xmlstarlet sel 
-N ns="http://maven.apache.org/POM/4.0.0" 
-t -m /ns:project 
-v ns:groupId -n 
-v ns:artifactId -n 
-v ns:version -n 
-v ns:packaging -n 
<pom.xml && printf ""
)

echo "pom.xml is for $groupId/$artifactId, version $version, with packaging $packaging"

हालांकि, क्या xmlstarlet वास्तव में उस स्क्रिप्ट में कमांड एक अलग अलग एक्सएसएलटी टेम्पलेट के बराबर है, जिसे आप XMLStarlet से गुज़रने के लिए जेनरेट करने के लिए कह सकते हैं -C तर्क:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://maven.apache.org/POM/4.0.0" xmlns:exslt="http://exslt.org/common" version="1.0" extension-element-prefixes="exslt">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:for-each select="/ns:project">
<xsl:call-template name="value-of-template">
<xsl:with-param name="select" select="ns:groupId"/>
</xsl:call-template>
<xsl:value-of select=""&#10;""/>
<xsl:call-template name="value-of-template">
<xsl:with-param name="select" select="ns:artifactId"/>
</xsl:call-template>
<xsl:value-of select=""&#10;""/>
<xsl:call-template name="value-of-template">
<xsl:with-param name="select" select="ns:version"/>
</xsl:call-template>
<xsl:value-of select=""&#10;""/>
<xsl:call-template name="value-of-template">
<xsl:with-param name="select" select="ns:packaging"/>
</xsl:call-template>
<xsl:value-of select=""&#10;""/>
</xsl:for-each>
</xsl:template>
<xsl:template name="value-of-template">
<xsl:param name="select"/>
<xsl:value-of select="$select"/>
<xsl:for-each select="exslt:node-set($select)[position()&gt;1]">
<xsl:value-of select=""&#10;""/>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

ध्यान दें कि हम "हमारे तत्वों को नहीं बना रहे हैंयहां आउटपुट, बल्कि न्यूलाइन द्वारा सीमित एक पाठ धारा उत्पन्न करना। (अगर हमारे मूल्यों में न्यूलाइन दिखाई दे सकती है, तो हमें अपने दृष्टिकोण को समायोजित करने की आवश्यकता है, लेकिन यह "मेवेन पीओएम में मामला नहीं है)।


यदि आप ऊपर दिए गए स्टाइलशीट का उपयोग कर रहे थे, तो सटीक स्क्रिप्ट होगी:

#!/bin/bash
IFS=$"n" read -r -d "" groupId artifactId version packaging 
< <(xsltproc stylesheet.xslt pom.xml) && printf "")

echo "pom.xml is for $groupId/$artifactId, version $version, with packaging $packaging"

जवाब के लिए 0 № 2

उपयोग करने के बेहतर विकल्प के नीचे xmllint। उदाहरण एक शेल स्क्रिप्ट है जो का मान देता है <version/> तत्व:

#!/bin/bash
echo "setns ns=http://maven.apache.org/POM/4.0.0
cat /ns:project/ns:version/text()" | 
xmllint --shell pom.xml | egrep -v "^(/ >| -----)"

उत्तर के लिए -2 № 3

मैं xsltproc के साथ काम करने के बजाय स्रोत XML फ़ाइल पर सीधे काम करके इसे प्राप्त करने में कामयाब रहा। मेरी खोल स्क्रिप्ट में मैंने निम्न चर बनाया है:

GROUPID = "$ (grep -Po" (? <=) W + (? =) "Name_of_xml_file_here"