2010-01-07 9 views
6

में विलय कर दिया जाए। मुझे पता है कि यह एक सीमा रेखा का मामला है चाहे वह वास्तव में स्टैक ओवरफ्लो या सुपरसियर से संबंधित हो, लेकिन ऐसा लगता है कि वहां कुछ 'संपादन कोड' प्रश्न हैं यहां, मैं इसे SO पर पोस्ट कर रहा हूं।एक फ्लैट एक्सएमएल कैसे प्राप्त करें ताकि बाहरी इकाइयों को शीर्ष स्तर

मेरे पास एक्सएमएल फाइलों का ढेर है कि किसी ने अपने अनंत ज्ञान में टैग का उपयोग करके कई फाइलों में विस्फोट करने का निर्णय लिया है, जिसके परिणामस्वरूप उन्हें डीबगिंग/संपादन एक विशाल पी-आई-टी-ए बनाता है। इसलिए मैं देख रहा हूं:

  1. वीआईएम में उन्हें एक ही बफर में खोलने का एक तरीका (अधिमानतः ताकि परिवर्तन बाहरी बाहरी फाइल फ़ाइलों में सहेजे गए हों), या;
  2. वीआईएम में फ़ाइलों का विस्तार करने का एक तरीका ताकि बाहरी इकाइयों को पढ़ा जा सके और बफर में बदल दिया जाए, या;
  3. एक आसान बैश/एक कमांड लाइन (या .vimrc में) पर ऐसा करने का/अजगर रास्ते sed

फ़ाइलें शीर्ष स्तर पर शामिल नई फ़ाइलें और इतने पर कौन जानता है पर पर कितने स्तरों शामिल हो सकता है तो यह पुनरावर्ती होने की जरूरत है ...

यहाँ शीर्ष स्तर फ़ाइल की तरह दिखता है पर एक mockup नमूना है:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foobar PUBLIC "foobar:dtd" "foobar.dtd" [ 

     <!ENTITY foo SYSTEM "foo.xml"> 

     <!ENTITY bar SYSTEM "bar.xml"> 
]> 
<foo> 
     <params> 
       &foo; 
     </params> 
     <bar> 
       &bar; 
     </bar> 
</foo> 

संपादित: सूची वरीयता के क्रम में है केवल आंशिक रूप से तरह @Gaby के लग रहा है इस सवाल का जवाब काम करता है, लेकिन दुर्भाग्य से, जब तक कि मैं कर रहा हूँ: - अगर कोई 1. या 2. समाधान उपलब्ध हैं, इनाम सबसे अच्छा # 3 के लिए चला जाता है ...

संपादित 2 कुछ गलत करना - मैं अपने उत्तर का उपयोग करके किसी प्रकार का टूल लिखूंगा और इसे सुधार के लिए यहां पोस्ट करूंगा। बेशक, एक # 1 या # 2 समाधान की सराहना की जाएगी ... :)

संपादित 3: ठीक है, सबसे अच्छा गैर Emacs -answer इनाम मिल जाएगा;)

निष्कर्ष : @hcayless को धन्यवाद अब मैं एक काम कर # 2 समाधान है, मैं कहा:

autocmd BufReadPost,FileReadPost *.xml silent %!xmllint --noent - 2> /dev/null 

मेरी .vimrc करने के लिए और सब कुछ hunky डोरि है।

+0

क्या यह xslt के साथ किया जा सकता है? – michael

+1

मैंने इसे पहले नहीं देखा था, लेकिन स्पष्ट रूप से यह एक्सएमएल के भलाई भाग के लिए ईमानदार है। http://www.xml.com/pub/a/98/08/xmlqna2.html एक स्पष्टीकरण है जिसे मैंने इसके लिए पाया है। – MikeSep

+0

हाँ, यह मान्य है और इसलिए कष्टप्रद के रूप में दोगुना :) – Kimvais

उत्तर

5

यदि आपके पास libxml2 स्थापित है, तो xmllint शायद आपके लिए यह करेगा। अपने सेटअप के आधार पर, आप और अधिक पैरामीटर की आवश्यकता हो सकती है, लेकिन अपने उदाहरण के लिए,

xmllint --noent foobar.xml 

अपनी फ़ाइल प्रिंट संकल्प लिया सभी संस्थाओं के साथ stdout करने के लिए होगा। आपको जो चाहिए उसे करने के लिए इसके आसपास कुछ बैश स्क्रिप्टिंग लपेटने के लिए पर्याप्त आसान होना चाहिए।

+0

पूरी तरह से काम करता है। धन्यवाद! - अब मुझे .xml -files खोलते समय इसे स्वचालित रूप से .vimrc में करने की आवश्यकता है। – Kimvais

1

# 3 विकल्प आपको pixdom पर एक नज़र डालें और pxdom 1.5 A Python DOM implementation

DOMConfiguration पर दस्तावेज़ देख सकते हैं के लिए मानकों

पार्स आपरेशन का परिणाम मापदंडों पर सेट पर निर्भर करता है LSParser.domConfig मैपिंग। डिफ़ॉल्ट डोम विनिर्देश के अनुसार, रखकर सभी CDATA भाग सादा पाठ नोड्स के साथ प्रतिस्थापित किया जाएगा और सभी बाध्य एंटिटी संदर्भ इकाई की सामग्री से बदल दिया जाएगा करने के लिए भेजा। इसमें बाहरी इकाई संदर्भ और बाहरी सबसेट शामिल है।

यह एक फाइल करने के लिए दस्तावेज़ को बचाने के लिए serializer शामिल ..

0

आप कुछ इस तरह के लिए देख रहे हैं?

#!/opt/local/bin/python 
import sys 
if len(sys.argv) < 2: 
    print "some files needed." 
    sys.exit() 

final = """ 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<nodes> 
""" 
for a in sys.argv[1:]: 
    ca = a.replace(".xml","") 
    final += "<" + ca + ">\n" 
    infile = open(a) 
    final += infile.read() 
    final += "</" + ca + ">\n" 

final += "</nodes>\n" 

outfile = open("final.xml", "w") 
outfile.write(final) 
outfile.close() 
संबंधित मुद्दे