xml - नोड को हटाने के लिए मैं नैनट के एक्सएमएलपीक लक्ष्य का उपयोग कैसे कर सकता हूं?



nant xmlpoke (1)

मैं अपना हाथ पकड़ता हूं! गलत प्रश्न पूछने का यह एक क्लासिक मामला है

समस्या यह है कि आप एकल नोड को हटाने के लिए xmlpoke का उपयोग नहीं कर सकते। एक्समलपोक का उपयोग किसी विशिष्ट नोड या विशेषता की सामग्री को संपादित करने के लिए किया जा सकता है। केवल मानक नैनट लक्ष्यों का उपयोग करते हुए प्रश्न के मुताबिक बाल नोड को हटाने का एक शानदार तरीका नहीं है। यह ननंत में गुणों का उपयोग करते हुए कुछ अजीब स्ट्रिंग हेरफेलेशन का उपयोग करके किया जा सकता है, लेकिन आप ऐसा क्यों करना चाहते हैं?

ऐसा करने का सबसे अच्छा तरीका एक साधारण नैनट लक्ष्य लिखना है। यहाँ पहले मैंने तैयार किया है:

using System;
using System.IO;
using System.Xml;
using NAnt.Core;
using NAnt.Core.Attributes;

namespace XmlStrip
{
    [TaskName("xmlstrip")]
    public class XmlStrip : Task
    {
        [TaskAttribute("xpath", Required = true), StringValidator(AllowEmpty = false)]
        public string XPath { get; set; }

        [TaskAttribute("file", Required = true)]
        public FileInfo XmlFile { get; set; }

        protected override void ExecuteTask()
        {
            string filename = XmlFile.FullName;
            Log(Level.Info, "Attempting to load XML document in file '{0}'.", filename );
            XmlDocument document = new XmlDocument();
            document.Load(filename);
            Log(Level.Info, "XML document in file '{0}' loaded successfully.", filename );

            XmlNode node = document.SelectSingleNode(XPath);
            if(null == node)
            {
                throw new BuildException(String.Format("Node not found by XPath '{0}'", XPath));
            }

            node.ParentNode.RemoveChild(node);

            Log(Level.Info, "Attempting to save XML document to '{0}'.", filename );
            document.Save(filename);
            Log(Level.Info, "XML document successfully saved to '{0}'.", filename );
        }
    }
}

कस्टम लक्ष्य को लोड करने के लिए NAnt.exe.config फ़ाइल में संशोधन के साथ उपरोक्त संस्करण को और निम्न स्क्रिप्ट को बिल्ड फ़ाइल में जोड़ें:

<xmlstrip xpath="//rootnode/childnode[@arg = 'b']" file="target.xml" />

यह childnode को target.xml से value b में एक तर्क arg के साथ निकाल देगा जो वास्तव में मैं पहली जगह में चाहता था!

निम्न XML को देखते हुए:

<rootnode>
   <childnode arg="a">Content A</childnode>
   <childnode arg="b">Content A</childnode>
</rootnode>

निम्नलिखित XPath के साथ XMLPoke का उपयोग करना:

rootnode/childnode[arg='b']

परिणाम (यदि जगह की जगह रिक्त है) है:

<rootnode>
   <childnode arg="a">Content A</childnode>
   <childnode arg="b"></childnode>
</rootnode>

जब हम वास्तव में चाइल्डएनोड खुद को हटाते हैं तो मूलभूत अंश की सामग्री निकाल दी गई है वांछित परिणाम है:

<rootnode>
   <childnode arg="a">Content A</childnode>
</rootnode>

बाइटनोड तर्क के आधार पर चाइल्डएनोड का चयन होना चाहिए।





xmlpoke