दिलचस्प पोस्ट
मैं jquery का उपयोग कर पृष्ठ पर एक विशिष्ट स्थान पर कैसे स्क्रॉल कर सकता हूं? कारक स्तर को साफ करना (कई स्तर / लेबल को ढंका जाना) एडीटी एंड्रॉइड गतिविधि के निर्माण की अनुमति नहीं देगा I MySQL त्रुटि 1045 (28000): उपयोगकर्ता 'बिल' @ 'लोकलहोस्ट' के लिए प्रवेश निषेध (पासवर्ड का उपयोग कर: हाँ) बड़ी सरणी आकारों में विभाजन की गलती सी # में सरणी स्लाइस मेवेन निर्भरता पर नोक्लेस डीफफाउंड एरर सी ++ में यूनिकोड वर्ण कैसे मुद्रित करें? ShouldAutorotateToInterfaceOrientation आईओएस 6 में नहीं बुलाया जा रहा है जावा निष्पादक सेवा कार्यों से अपवादों को संभालना मैं जावास्क्रिप्ट में एक नियमित अभिव्यक्ति के लिए सभी मैचों को कैसे प्राप्त करूं? विभिन्न पंक्ति लंबाई के साथ बहुआयामी arrays के आवंटन के लिए malloc का उपयोग करना एंड्रॉइड नया नीचे नेविगेशन बार बाश में, मैं कैसे जांच सकता हूँ अगर कोई स्ट्रिंग कुछ मान से शुरू होती है? Log4j के साथ विभिन्न सामग्री की एकाधिक लॉग फाइल बनाना

एक्सएमएल नोड जावा से एक्सपेथ बनाएं / प्राप्त करें

मुझे वास्तविक कार्यान्वयन की बजाय सलाह / छद्म कोड / स्पष्टीकरण में दिलचस्पी है

  • मैं गर्त xml दस्तावेज़ जाना चाहता हूं, उसके सभी नोड्स
  • विशेषता अस्तित्व के लिए नोड की जांच करें

यदि नोड में विशेषता नहीं है, तो get/generate String with value of its xpath
यदि नोड में विशेषताओं हैं, तो गर्त विशेषता सूची को पुनरावृत्त करें और नोड सहित प्रत्येक विशेषता के लिए xpath बनाएं।

सलाह के शब्द? उम्मीद है कि आप कुछ उपयोगी इंटेल प्रदान करेंगे

संपादित करें:

ऐसा करने का कारण है … मैं स्वचालित परीक्षण jmeter में लिख रहा हूँ, इसलिए हर अनुरोध के लिए मुझे यह सत्यापित करने की आवश्यकता है कि वास्तव में इसकी नौकरी हुई है इसलिए मैं xpath के साथ नोड्स मान प्राप्त कर रहा हूं। (अतिरिक्त जानकारी – अप्रासंगिक)

जब अनुरोध छोटा होता है तो हाथ से दावा करने की समस्या नहीं होती है, लेकिन बड़े लोगों के लिए यह वास्तव में दर्द है .. (अतिरिक्त जानकारी – अप्रासंगिक)

बैट्टी:

मैं जावा दृष्टिकोण की तलाश कर रहा हूं

लक्ष्य

मेरा लक्ष्य इस पूर्व एक्सएमएल फ़ाइल से निम्नलिखित प्राप्त करना है:

 <root> <elemA>one</elemA> <elemA attribute1='first' attribute2='second'>two</elemA> <elemB>three</elemB> <elemA>four</elemA> <elemC> <elemB>five</elemB> </elemC> </root> 

निम्नलिखित का निर्माण करने के लिए:

 //root[1]/elemA[1]='one' //root[1]/elemA[2]='two' //root[1]/elemA[2][@attribute1='first'] //root[1]/elemA[2][@attribute2='second'] //root[1]/elemB[1]='three' //root[1]/elemA[3]='four' //root[1]/elemC[1]/elemB[1]='five' 

व्याख्या की :

  • यदि नोड का मान / पाठ शून्य / शून्य नहीं है, तो एक्सपेथ प्राप्त करें, जोड़ने के उद्देश्य के लिए = 'नोडेव्यू' जोड़ें
  • यदि नोड में गुण हैं तो उनके लिए भी जोर डालें

बैट्टी अद्यतन:

मैंने यह उदाहरण पाया, यह सही परिणाम नहीं पेश करता है, लेकिन मैं इस तरह से कुछ देख रहा हूं:

http://www.coderanch.com/how-to/java/SAXCreateXPath

वेब के समाधान से एकत्रित समाधान "एक्सएमएल नोड जावा से एक्सपेथ बनाएं / प्राप्त करें"

अपडेट करें :

@ c0mrade ने अपना प्रश्न अपडेट कर दिया है यहां इसका समाधान है:

यह XSLT रूपांतरण :

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:variable name="vApos">'</xsl:variable> <xsl:template match="*[@* or not(*)] "> <xsl:if test="not(*)"> <xsl:apply-templates select="ancestor-or-self::*" mode="path"/> <xsl:value-of select="concat('=',$vApos,.,$vApos)"/> <xsl:text>&#xA;</xsl:text> </xsl:if> <xsl:apply-templates select="@*|*"/> </xsl:template> <xsl:template match="*" mode="path"> <xsl:value-of select="concat('/',name())"/> <xsl:variable name="vnumPrecSiblings" select= "count(preceding-sibling::*[name()=name(current())])"/> <xsl:if test="$vnumPrecSiblings"> <xsl:value-of select="concat('[', $vnumPrecSiblings +1, ']')"/> </xsl:if> </xsl:template> <xsl:template match="@*"> <xsl:apply-templates select="../ancestor-or-self::*" mode="path"/> <xsl:value-of select="concat('[@',name(), '=',$vApos,.,$vApos,']')"/> <xsl:text>&#xA;</xsl:text> </xsl:template> </xsl:stylesheet> 

प्रदान किए गए XML दस्तावेज़ पर लागू होने पर :

 <root> <elemA>one</elemA> <elemA attribute1='first' attribute2='second'>two</elemA> <elemB>three</elemB> <elemA>four</elemA> <elemC> <elemB>five</elemB> </elemC> </root> 

ठीक वांछित, सही परिणाम उत्पन्न करता है :

 /root/elemA='one' /root/elemA[2]='two' /root/elemA[2][@attribute1='first'] /root/elemA[2][@attribute2='second'] /root/elemB='three' /root/elemA[3]='four' /root/elemC/elemB='five' 

@ C0mrade द्वारा नव-प्रदत्त दस्तावेज़ पर लागू होने पर :

 <root> <elemX serial="kefw90234kf2esda9231"> <id>89734</id> </elemX> </root> 

फिर सही परिणाम का उत्पादन होता है :

 /root/elemX='89734' /root/elemX[@serial='kefw90234kf2esda9231'] 

स्पष्टीकरण :

  • केवल ऐसे तत्व जिनके पास कोई बच्चा तत्व नहीं है, या गुण हैं, वे मेल खाते और संसाधित होते हैं।

  • किसी भी तत्व के लिए, यदि इसके पास बच्चे नहीं हैं – तत्वों के सभी पूर्वजों – या स्व तत्वों को एक विशिष्ट मोड में संसाधित किया जाता है, जिसका नाम 'path' । फिर "='theValue'" हिस्सा आउटपुट है और फिर एक एनएल वर्ण है।

  • मिलान किए गए तत्व के सभी गुणों को तब संसाधित किया जाता है

  • फिर अंत में, सभी बच्चों-तत्वों पर टेम्पलेट लागू होते हैं

  • 'path' मोड में एक तत्व का प्रसंस्करण सरल है : ए / चरित्र और तत्व का नाम आउटपुट है। फिर, यदि पूर्ववर्ती भाई-बहनों को एक ही नाम से जाना जाता है, तो एक "[numPrecSiblings + 1]` हिस्सा आउटपुट होता है

  • विशेषताओं का प्रसंस्करण सरल है : पहले अपने मूल के ancestor-or-self:: तत्वों को 'path' मोड में संसाधित किया जाता है, फिर [attrName = attrvalue] हिस्सा आउटपुट होता है, उसके बाद एनएल वर्ण होता है

ध्यान दें :

  • नाम जो एक नेमस्पेस में हैं, बिना किसी समस्या के प्रदर्शित किए जाते हैं और अपने शुरुआती पठनीय रूप में प्रदर्शित होते हैं।

  • पठनीयता की सहायता के लिए, [1] का एक सूचक प्रदर्शित नहीं होता है।


नीचे मेरा आरंभिक उत्तर है (अनदेखा किया जा सकता है)

यहां एक शुद्ध XSLT 1.0 समाधान है :

नीचे एक नमूना xml दस्तावेज़ और एक स्टाइलशीट है जो नोड-सेट पैरामीटर लेता है और प्रत्येक सदस्य-नोड के लिए एक वैध XPath अभिव्यक्ति का उत्पादन करता है।

स्टाइलशीट (बिल्डपाथ.एक्सएसएल):


 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl="urn:schemas-microsoft-com:xslt" > <xsl:output method="text"/> <xsl:variable name="theParmNodes" select="//namespace::*[local-name() = 'myNamespace']"/> <xsl:template match="/"> <xsl:variable name="theResult"> <xsl:for-each select="$theParmNodes"> <xsl:variable name="theNode" select="."/> <xsl:for-each select="$theNode | $theNode/ancestor-or-self::node()[..]"> <xsl:element name="slash">/</xsl:element> <xsl:choose> <xsl:when test="self::*"> <xsl:element name="nodeName"> <xsl:value-of select="name()"/> <xsl:variable name="thisPosition" select="count(preceding-sibling::*[name(current()) = name()])"/> <xsl:variable name="numFollowing" select="count(following-sibling::*[name(current()) = name()])"/> <xsl:if test="$thisPosition + $numFollowing > 0"> <xsl:value-of select="concat('[', $thisPosition + 1, ']')"/> </xsl:if> </xsl:element> </xsl:when> <xsl:otherwise> <!-- This node is not an element --> <xsl:choose> <xsl:when test="count(. | ../@*) = count(../@*)"> <!-- Attribute --> <xsl:element name="nodeName"> <xsl:value-of select="concat('@',name())"/> </xsl:element> </xsl:when> <xsl:when test="self::text()"> <!-- Text --> <xsl:element name="nodeName"> <xsl:value-of select="'text()'"/> <xsl:variable name="thisPosition" select="count(preceding-sibling::text())"/> <xsl:variable name="numFollowing" select="count(following-sibling::text())"/> <xsl:if test="$thisPosition + $numFollowing > 0"> <xsl:value-of select="concat('[', $thisPosition + 1, ']')"/> </xsl:if> </xsl:element> </xsl:when> <xsl:when test="self::processing-instruction()"> <!-- Processing Instruction --> <xsl:element name="nodeName"> <xsl:value-of select="'processing-instruction()'"/> <xsl:variable name="thisPosition" select="count(preceding-sibling::processing-instruction())"/> <xsl:variable name="numFollowing" select="count(following-sibling::processing-instruction())"/> <xsl:if test="$thisPosition + $numFollowing > 0"> <xsl:value-of select="concat('[', $thisPosition + 1, ']')"/> </xsl:if> </xsl:element> </xsl:when> <xsl:when test="self::comment()"> <!-- Comment --> <xsl:element name="nodeName"> <xsl:value-of select="'comment()'"/> <xsl:variable name="thisPosition" select="count(preceding-sibling::comment())"/> <xsl:variable name="numFollowing" select="count(following-sibling::comment())"/> <xsl:if test="$thisPosition + $numFollowing > 0"> <xsl:value-of select="concat('[', $thisPosition + 1, ']')"/> </xsl:if> </xsl:element> </xsl:when> <!-- Namespace: --> <xsl:when test="count(. | ../namespace::*) = count(../namespace::*)"> <xsl:variable name="apos">'</xsl:variable> <xsl:element name="nodeName"> <xsl:value-of select="concat('namespace::*', '[local-name() = ', $apos, local-name(), $apos, ']')"/> </xsl:element> </xsl:when> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:text>&#xA;</xsl:text> </xsl:for-each> </xsl:variable> <xsl:value-of select="msxsl:node-set($theResult)"/> </xsl:template> </xsl:stylesheet> 

xml स्रोत (बिल्डपाथ.एक्सएमएल):


 <!-- top level Comment --> <root> <nodeA>textA</nodeA> <nodeA id="nodeA-2"> <?myProc ?> xxxxxxxx <nodeB/> <nodeB xmlns:myNamespace="myTestNamespace"> <!-- Comment within /root/nodeA[2]/nodeB[2] --> <nodeC/> <!-- 2nd Comment within /root/nodeA[2]/nodeB[2] --> </nodeB> yyyyyyy <nodeB/> <?myProc2 ?> </nodeA> </root> <!-- top level Comment --> 

परिणाम :

 /root/nodeA[2]/nodeB[2]/namespace::*[local-name() = 'myNamespace'] /root/nodeA[2]/nodeB[2]/nodeC/namespace::*[local-name() = 'myNamespace'] 

यहां बताया गया है कि यह कैसे SAX के साथ किया जा सकता है:

 import java.util.HashMap; import java.util.Map; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class FragmentContentHandler extends DefaultHandler { private String xPath = "/"; private XMLReader xmlReader; private FragmentContentHandler parent; private StringBuilder characters = new StringBuilder(); private Map<String, Integer> elementNameCount = new HashMap<String, Integer>(); public FragmentContentHandler(XMLReader xmlReader) { this.xmlReader = xmlReader; } private FragmentContentHandler(String xPath, XMLReader xmlReader, FragmentContentHandler parent) { this(xmlReader); this.xPath = xPath; this.parent = parent; } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { Integer count = elementNameCount.get(qName); if(null == count) { count = 1; } else { count++; } elementNameCount.put(qName, count); String childXPath = xPath + "/" + qName + "[" + count + "]"; int attsLength = atts.getLength(); for(int x=0; x<attsLength; x++) { System.out.println(childXPath + "[@" + atts.getQName(x) + "='" + atts.getValue(x) + ']'); } FragmentContentHandler child = new FragmentContentHandler(childXPath, xmlReader, this); xmlReader.setContentHandler(child); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { String value = characters.toString().trim(); if(value.length() > 0) { System.out.println(xPath + "='" + characters.toString() + "'"); } xmlReader.setContentHandler(parent); } @Override public void characters(char[] ch, int start, int length) throws SAXException { characters.append(ch, start, length); } } 

इसके साथ परीक्षण किया जा सकता है:

 import java.io.FileInputStream; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; public class Demo { public static void main(String[] args) throws Exception { SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); xr.setContentHandler(new FragmentContentHandler(xr)); xr.parse(new InputSource(new FileInputStream("input.xml"))); } } 

यह वांछित उत्पादन का उत्पादन करेगा:

 //root[1]/elemA[1]='one' //root[1]/elemA[2][@attribute1='first] //root[1]/elemA[2][@attribute2='second] //root[1]/elemA[2]='two' //root[1]/elemB[1]='three' //root[1]/elemA[3]='four' //root[1]/elemC[1]/elemB[1]='five' 

Joox (जावा के लिए एक jquery एपीआई पोर्ट, अस्वीकरण – मैं पुस्तकालय के पीछे कंपनी के लिए काम करता हूं), आप लगभग एक कथन में क्या चाहते हैं, उसे प्राप्त कर सकते हैं:

 // I'm assuming this: import static org.joox.JOOX.$; // And then... List<String> coolList = $(document).xpath("//*[not(*)]").map( context -> $(context).xpath() + "='" + $(context).text() + "'" ); 

यदि दस्तावेज़ आपका नमूना दस्तावेज़ है:

 <root> <elemA>one</elemA> <elemA attribute1='first' attribute2='second'>two</elemA> <elemB>three</elemB> <elemA>four</elemA> <elemC> <elemB>five</elemB> </elemC> </root> 

यह उत्पादन करेगा

 /root[1]/elemA[1]='one' /root[1]/elemA[2]='two' /root[1]/elemB[1]='three' /root[1]/elemA[3]='four' /root[1]/elemC[1]/elemB[1]='five' 

"लगभग" के द्वारा, मेरा मतलब है कि joox (अभी तक) मिलान / मानचित्रण विशेषताओं का समर्थन नहीं करता है। इसलिए, आपके गुण किसी भी आउटपुट का उत्पादन नहीं करेंगे। यह निकट भविष्य में लागू किया जाएगा, यद्यपि।

  1. w3c.dom का उपयोग करें
  2. फिर से नीचे जाएं
  3. प्रत्येक नोड के लिए यह xpath प्राप्त करने का आसान तरीका है: या तो # 2 के रूप में इसे अरैरे / सूची के रूप में संग्रहीत करके, जो कि माता-पिता अनुपचारित होने तक पुनरावर्ती रूप से चलते हैं, फिर ऐरे / नोड्स की सूची में वापस लौटाता है

ऐसा कुछ।

UPD: और अंतिम xpath प्राप्त करने के लिए अंतिम सूची को जोड़ना। मत सोचो कि गुण एक समस्या होगी।

 private static void buildEntryList( List<String> entries, String parentXPath, Element parent ) { NamedNodeMap attrs = parent.getAttributes(); for( int i = 0; i < attrs.getLength(); i++ ) { Attr attr = (Attr)attrs.item( i ); //TODO: escape attr value entries.add( parentXPath+"[@"+attr.getName()+"='"+attr.getValue()+"']"); } HashMap<String, Integer> nameMap = new HashMap<String, Integer>(); NodeList children = parent.getChildNodes(); for( int i = 0; i < children.getLength(); i++ ) { Node child = children.item( i ); if( child instanceof Text ) { //TODO: escape child value entries.add( parentXPath+"='"+((Text)child).getData()+"'" ); } else if( child instanceof Element ) { String childName = child.getNodeName(); Integer nameCount = nameMap.get( childName ); nameCount = nameCount == null ? 1 : nameCount + 1; nameMap.put( child.getNodeName(), nameCount ); buildEntryList( entries, parentXPath+"/"+childName+"["+nameCount+"]", (Element)child); } } } public static List<String> getEntryList( Document doc ) { ArrayList<String> entries = new ArrayList<String>(); Element root = doc.getDocumentElement(); buildEntryList(entries, "/"+root.getNodeName()+"[1]", root ); return entries; } 

यह कोड दो मान्यताओं के साथ काम करता है: आप नामस्थान का उपयोग नहीं कर रहे हैं और कोई मिश्रित सामग्री तत्व नहीं हैं। नेमस्पेस सीमा एक गंभीर नहीं है, लेकिन यह आपके XPath अभिव्यक्ति को पढ़ने के लिए बहुत कठिन बनाना चाहती है, क्योंकि प्रत्येक तत्व *:<name>[namespace-uri()='<nsuri>'][<index>] , लेकिन अन्यथा यह लागू करना आसान है। दूसरी तरफ मिश्रित सामग्री xpath का प्रयोग बहुत ही थकाऊ बना देती है, क्योंकि आपको किसी तत्व के भीतर दूसरे, तीसरे और पाठ नोड पर व्यक्तिगत रूप से संबोधित करने में सक्षम होना चाहिए।

मैंने एक बार ऐसा काम किया है इस्तेमाल किया गया मुख्य विचार यह था कि आप xpath में तत्व के अनुक्रमित उपयोग कर सकते हैं। उदाहरण के लिए निम्नलिखित xml में

 <root> <el /> <something /> <el /> </root> 

xpath को दूसरे <el/> होगा /root[1]/el[2] (xpath अनुक्रमित 1-आधारित हैं)। यह "पहले जड़ लेता है, फिर नाम के साथ सभी तत्वों से दूसरे को ले लो" के रूप में पढ़ता है। तो तत्व तत्व el तत्वों के अनुक्रमण को प्रभावित नहीं करता है तो आप सिद्धांत में अपने xml में प्रत्येक विशिष्ट तत्व के लिए एक xpath बना सकते हैं। अभ्यास में मैंने पेड़ को पुनरावृत्ति से चलने और रास्ते में तत्वों और उनके अनुक्रमित जानकारी के बारे में याद करके इसे पूरा किया है।
एक्सपैथ तत्व की विशिष्ट विशेषता को संदर्भित करना तब तत्व के xpath में '/ @ attrName' जोड़ रहा था।

मैंने प्रैक्टिकल एक्सएमएल पुस्तकालय में एक तत्व के निरपेक्ष पथ को वापस करने के लिए एक विधि लिखा है। आपको यह कैसे काम करता है की एक विचार देने के लिए, यहां इकाई परीक्षणों में से एक निकालने का एक रूप है:

 assertEquals("/root/wargle[2]/zargle", DomUtil.getAbsolutePath(child3a)); 

इसलिए, आप दस्तावेज़ के माध्यम से पुनः जांच कर सकते हैं, अपने परीक्षणों को लागू कर सकते हैं, और इसका उपयोग XPath को वापस करने के लिए कर सकते हैं। या, जो शायद बेहतर है, वह है कि आप उसी पुस्तकालय से XPath- आधारित दावा का उपयोग कर सकते हैं।

पिछले हफ्ते मैंने अपने एक्सएमएल को सॉल्वर आज्ञाकारी प्रारूप में प्रसंस्करण के लिए ठीक उसी चीज की थी।

चूंकि आप एक छद्म कोड चाहते थे: इस तरह मैंने इसे पूरा किया।

// आप माता-पिता और बच्चे के संदर्भ को छोड़ सकते हैं

1_ एक कस्टम नोड ऑब्जेक्ट को प्रारंभ करें: NodeObjectVO {स्ट्रिंग नोड नाम, स्ट्रिंग पथ, लिस्ट एट्रि, नोड ऑब्जेक्ट VO पेरेंट, लिस्ट बच्चे}

2_ एक खाली सूची बनाएँ

3_ एक्सएमएल के एक डोम का प्रतिनिधित्व करना और नोड के पुनरावृति करना। प्रत्येक नोड के लिए, संबंधित जानकारी प्राप्त करें सभी जानकारी जैसे नोड नाम, विशेषता नाम और मान को आसानी से डोम ऑब्जेक्ट से उपलब्ध होना चाहिए। (आपको डोम नोडटाइप की जांच करने की आवश्यकता है, कोड को प्रसंस्करण निर्देश और सादा पाठ नोड्स की अनदेखी करनी चाहिए।)

// कोड ब्लोट चेतावनी 4_ केवल मुश्किल भाग का रास्ता मिल रहा है मैंने नोड एलेमेंट से xpath स्ट्रिंग प्राप्त करने के लिए एक पुनरावृत्त उपयोगिता विधि बनाया है (जबकि (नोड। जनक! = नल) {path + = node.parent.nodeName}

(आप वैश्विक पथ वैरिएबल को बनाए रखने के द्वारा भी इसे प्राप्त कर सकते हैं, जो हर चलने के लिए पैरेंट पथ का ट्रैक रखता है।)

5_ SetAttributes (सूची) के सेटर विधि में, मैं वस्तु के पथ को सभी उपलब्ध विशेषताओं के साथ जोड़ दूंगा। (सभी उपलब्ध विशेषताओं के साथ एक पथ। प्रत्येक संभव गुण के संयोजन के साथ पथ की एक सूची नहीं। आप कुछ और तरीके से करना चाह सकते हैं।)

6_ सूची में नोड ऑब्जेक्ट VO जोड़ें।

7_ अब हमारे पास कस्टम नोड ऑब्जेक्ट्स की एक फ्लैट (पदानुक्रमित) सूची नहीं है, जिसकी मुझे सारी जानकारी है I

(ध्यान दें: जैसे मैंने उल्लेख किया है, मैं माता-पिता के बच्चे के रिश्ते को बनाए रखता हूं, आपको उस भाग को छोड़ना चाहिए। कोड ब्लोटिंग की संभावना है, खासकर जब गेटपरपैथ। छोटे एक्सएमएल के लिए यह समस्या नहीं थी, लेकिन यह बड़ी एक्सएमएल के लिए एक चिंता का विषय है) ।