/ / मैच मिलने के बाद एक टैग को कैसे हटाएं - xml, shell

मैच मिलने के बाद एक टैग को कैसे हटाएं - xml, shell

मैं इस तरह की एक परिस्थिति में फंस गया हूं जहां 2 एक्सएमएल टैग एक फ़ाइल में यादृच्छिक पैटर्न में एक के बाद आ रहे हैं। ईजी के लिए:

कुछ टैग ......

<ServiceConfig Id ="403">
<ServiceConfig Id ="345">

जबकि मुझे जहां भी दोहराया जा रहा है, वहां मुझे TAG ServiceConfig ID का दूसरा मौका चाहिए। उपरोक्त की तरह मुझे पसंद है

<ServcieConfig Id ="345">.

मैं यह कैसे कर सकता हूं यानी मैं सभी प्रतिष्ठित सेवा कॉन्फिग टैग कैसे हटा सकता हूं?

पीएस.- आईडी टैग सभी टैग्स के लिए अलग है जो अनुपालनशील हैं।

धन्यवाद,

उत्तर:

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

आप इसके लिए एक स्क्रिप्ट भाषा या यहां तक ​​कि एक्सएसएलटी का उपयोग कर सकते हैं। हालांकि दोनों समाधानों को ब्याज के नोड्स को संबोधित करने के लिए xpath का उपयोग करने की आवश्यकता होगी, मैं इसका उपयोग कर रहा हूं:

//ServiceConfig[name(preceding-sibling::*[1]) = "ServiceConfig"]

यह उन सभी नोड्स का चयन करता है जहां पिछला भाई भी एक है ServiceConfig नोड।


अब दिखाएगा कि 1. एक्सएसएलटी और 2. पायथन का उपयोग करके उस नोड्स को कैसे हटाया जाए। उदाहरण के लिए मैंने निम्नलिखित xml फ़ाइल का उपयोग किया है:

test.xml

<?xml version="1.0"?>
<data>
<node>
<sub id="1" />
<some />
<sub id="2" />
</node>
<node>
<some />
<sub id="3" />
<sub id="4" />
</node>
</data>

एक्सएसएलटी आधारित समाधान

delete.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//sub[name(preceding-sibling::*[1]) = "sub"]">
<!-- empty, leads to tag removal -->
</xsl:template>
<!-- identy transformation of the remaing node -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

इसे निष्पादित करो:

xsltproc delete.xsl test.xml

पायथन आधारित समाधान

delete.py

import libxml2

doc = libxml2.parseFile("test.xml")
ctx = doc.xpathNewContext()
res = ctx.xpathEval("//sub[name(preceding-sibling::*[1]) = "sub"]")

for item in res:
item.unlinkNode()

print doc

इसे निष्पादित करो:

python delete.py

दोनों समाधानों का आउटपुट है:

<?xml version="1.0"?>
<data>
<node>
<sub id="1"/>
<some/>
<sub id="2"/>
</node>
<node>
<some/>
<sub id="3"/>

</node>
</data>

आप एक का उपयोग कर रिक्त रेखा को ठीक कर सकते हैं सुंदर प्रिंटर, मैं अव्यवस्था के लिए छोड़ दिया है।