कमांड लाइन से XML को कैसे प्रिंट करें?


526

संबंधित: मैं JSON इन (यूनिक्स) शेल स्क्रिप्ट को कैसे प्रिंट कर सकता हूं?

XML को मानव-पठनीय रूप में प्रारूपित करने के लिए एक (यूनिक्स) शेल स्क्रिप्ट है?

मूल रूप से, मैं चाहता हूं कि यह निम्नलिखित को रूपांतरित करे:

<root><foo a="b">lorem</foo><bar value="ipsum" /></root>

... कुछ इस तरह से:

<root>
    <foo a="b">lorem</foo>
    <bar value="ipsum" />
</root>

1
करवाने के लिए xmllintडेबियन सिस्टम पर उपलब्ध है, तो आप पैकेज स्थापित करने की जरूरत है libxml2-utils( libxml2इस उपकरण प्रदान नहीं करता है, कम से कम डेबियन 5.0 "लेनी" और 6.0 "निचोड़" पर नहीं)।
टहनियाँ

जवाबों:


908

libxml2-utils

इस उपयोगिता के साथ आता है libxml2-utils:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmllint --format -

पर्ल के XML::Twig

यह कमांड XML :: Twig के साथ आती है मॉड्यूल, कभी-कभी xml-twig-toolsपैकेज:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xml_pp

xmlstarlet

इस आदेश के साथ आता है xmlstarlet:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    xmlstarlet format --indent-tab

tidy

tidyपैकेज की जाँच करें :

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    tidy -xml -i -

अजगर

पायथन के xml.dom.minidomXML को प्रारूपित किया जा सकता है (दोनों python2 और python3):

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print(xml.dom.minidom.parseString(s).toprettyxml())'

saxon-lint

आपको चाहिए saxon-lint:

echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    saxon-lint --indent --xpath '/' -

saxon-HE

आपको चाहिए saxon-HE:

 echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' |
    java -cp /usr/share/java/saxon/saxon9he.jar net.sf.saxon.Query \
    -s:- -qs:/ '!indent=yes'

अच्छा, जल्दी जवाब। पहला विकल्प ऐसा लगता है कि यह आधुनिक * निक्स इंस्टॉल पर अधिक सर्वव्यापी होगा। एक मामूली बिंदु; लेकिन यह एक मध्यवर्ती फ़ाइल के माध्यम से काम किए बिना कहा जा सकता है? यानी echo '<xml .. />' | xmllint --some-read-from-stdn-option,?
19

पैकेज libxml2-utilsमेरी खूबसूरत ubuntu में है।
फ्रेंज़ेलेंज़ोन

1
ध्यान दें कि "cat data.xml | xmllint --format - | tee data.xml" काम नहीं करता है। मेरे सिस्टम पर यह कभी-कभी छोटी फ़ाइलों के लिए काम करता था, लेकिन हमेशा बड़ी फ़ाइलों को काट दिया। यदि आप वास्तव में backreference.org/2011/01/29/in-place-editing-of-files
user1346466

1
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 805: ordinal not in range(128)अजगर संस्करण में हल करने के लिए आप को परिभाषित करना चाहते हैं PYTHONIOENCODING="UTF-8":cat some.xml | PYTHONIOENCODING="UTF-8" python -c 'import sys;import xml.dom.minidom;s=sys.stdin.read();print xml.dom.minidom.parseString(s).toprettyxml()' > pretty.xml
FelikZ

1
ध्यान दें कि tidy बिना रूट एलिमेंट के भी xml को फॉर्मेट कर सकता है । यह एक पाइप, xml वर्गों (जैसे लॉग से निकाले गए) के माध्यम से प्रारूपित करने के लिए उपयोगी है। echo '<x></x><y></y>' | tidy -xml -iq
मैरिनो एक

157

xmllint --format yourxmlfile.xml

xmllint एक कमांड लाइन XML टूल है और इसे libxml2( http://xmlsoft.org/ ) में शामिल किया गया है ।

================================================

नोट: यदि आपने libxml2स्थापित नहीं किया है तो आप निम्न कार्य करके इसे स्थापित कर सकते हैं:

CentOS

cd /tmp
wget ftp://xmlsoft.org/libxml2/libxml2-2.8.0.tar.gz
tar xzf libxml2-2.8.0.tar.gz
cd libxml2-2.8.0/
./configure
make
sudo make install
cd

उबंटू

sudo apt-get install libxml2-utils

Cygwin

apt-cyg install libxml2

मैक ओ एस

होमबॉव के साथ मैकओएस पर इसे स्थापित करने के लिए बस करें: brew install libxml2

Git

यदि आप कोड चाहते हैं तो Git पर भी उपलब्ध है: git clone git://git.gnome.org/libxml2


4
स्पुतनिक के उत्तर में यह जानकारी होती है, लेकिन XML के बारे में सामान्य प्रश्न के लिए crmpicco का उत्तर सबसे उपयोगी है।
सेठ डिफर्ले

2
हम कुछ अन्य xml फ़ाइल के लिए उस स्वरूपित xml आउटपुट को लिख सकते हैं और इसका उपयोग कर सकते हैं .. जैसे xmllint --format yourxmlfile.xml >> new-file.xml
LearnToLive

2
उबंटू 16.04 पर आप निम्न का उपयोग कर सकते हैं:sudo apt-get install libxml2-utils
मेले

यह विंडोज पर भी काम करता है; gitविंडोज डाउनलोड के लिए भी का एक हालिया संस्करण स्थापित करता है xmllint। उदाहरण:"C:\Program Files\Git\usr\bin\xmllint.exe" --format QCScaper.test@borland.com.cds.xml > QCScaper.test@borland.com.pretty-printed.cds.xml
जीरो वेर्ट प्लिमर्स

41

आप सुव्यवस्थित रूप से भी उपयोग कर सकते हैं , जिसे पहले स्थापित करने की आवश्यकता हो सकती है (उदाहरण के लिए Ubuntu: sudo apt-get install tidy)।

इसके लिए, आप कुछ इस तरह जारी करेंगे:

tidy -xml -i your-file.xml > output.xml

ध्यान दें: कई अतिरिक्त पठनीयता झंडे हैं, लेकिन शब्द-लपेट व्यवहार असंगत ( http://tidy.sourceforge.net/docs/quickref.html ) के लिए थोड़ा कष्टप्रद है ।


1
मददगार, क्योंकि मुझे xmllint को सिंगल लाइन xml फ़ाइल में लाइनब्रीक जोड़ने के लिए नहीं मिला। धन्यवाद!
xlttj

tidyमेरे लिए भी अच्छा काम करता है। इसके विपरीत hxnormalize, यह वास्तव में <body>टैग को बंद कर देता है ।
श्रीधर सरनोबत

9
BTW, यहाँ कुछ विकल्प हैं जो मुझे उपयोगी लगे हैं tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml:।
विक्टर यारमा

2
शानदार टिप @VictorYarema मैंने इसे पाइलेटाइजेशन के साथ जोड़ा और इसे मेरे .bashrc में जोड़ा: alias prettyxml='tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes | pygmentize -l xml' और फिर कर सकते हैंcurl url | prettyxml
नेट वुल्फ

13

आपने किसी फ़ाइल का उल्लेख नहीं किया है, इसलिए मुझे लगता है कि आप XML स्ट्रिंग को कमांड लाइन पर मानक इनपुट के रूप में प्रदान करना चाहते हैं। उस मामले में, निम्नलिखित करें:

$ echo '<root><foo a="b">lorem</foo><bar value="ipsum" /></root>' | xmllint --format -

12

MacOS / सबसे यूनिक्स पर कुछ भी स्थापित किए बिना।

उपयोग tidy

cat filename.xml | tidy -xml -iq

Xml के फ़ाइल प्रकार को स्पष्ट करने के लिए बिल्ली के साथ एक फ़ाइल को पुनर्निर्देशित करना और चुपचाप आउटपुट करते समय इंडेंट करना त्रुटि आउटपुट को दबा देगा। JSON भी साथ काम करता है -json


1
आप की जरूरत नहीं है catकदम: tidy -xml -iq filename.xml। इसके अलावा, आप मूल फ़ाइल को संशोधित करने tidy -xml -iq filename.xmlके -mविकल्प का उपयोग भी कर सकते हैं ...
janniks

10

जगह में xmllint समर्थन स्वरूपण :

for f in *.xml; do xmllint -o $f --format $f; done

जैसा कि डैनियल वीलार्ड ने लिखा है:

मुझे लगता है कि xmllint -o tst.xml --format tst.xml सुरक्षित होना चाहिए क्योंकि पार्सर उत्पादन को क्रमबद्ध करने से पहले इनपुट को पूरी तरह से एक पेड़ में लोड कर देगा।

इंडेंट स्तर को XMLLINT_INDENTपर्यावरण चर द्वारा नियंत्रित किया जाता है जो डिफ़ॉल्ट रूप से 2 रिक्त स्थान द्वारा होता है। उदाहरण के लिए 4 रिक्त स्थान बदलने के लिए कैसे:

XMLLINT_INDENT='    '  xmllint -o out.xml --format in.xml

--recoverजब आपके XML दस्तावेज़ टूट जाते हैं तो आपके पास विकल्प की कमी हो सकती है । या कठोर XML आउटपुट के साथ कमजोर HTML पार्सर आज़माएं:

xmllint --html --xmlout <in.xml >out.xml

--nsclean, --nonet, --nocdata, --noblanksआदि उपयोगी हो सकता है। मैन पेज पढ़ें।

apt-get install libxml2-utils
apt-cyg install libxml2
brew install libxml2

2

यह मुझे हमेशा के लिए अपने मैक पर काम करने वाली चीज़ खोजने के लिए ले गया। यहाँ मेरे लिए क्या काम किया गया है:

brew install xmlformat
cat unformatted.html | xmlformat

1
ऊपर मेरा जवाब एक मैक पर काम करता है
jasonleonhard

1

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

#!/bin/bash

declare -i currentIndent=0
declare -i nextIncrement=0
while read -r line ; do
  currentIndent+=$nextIncrement
  nextIncrement=0
  if [[ "$line" == "</"* ]]; then # line contains a closer, just decrease the indent
    currentIndent+=-1
  else
    dirtyStartTag="${line%%>*}"
    dirtyTagName="${dirtyStartTag%% *}"
    tagName="${dirtyTagName//</}"
    # increase indent unless line contains closing tag or closes itself
    if [[ ! "$line" =~ "</$tagName>" && ! "$line" == *"/>"  ]]; then
      nextIncrement+=1
    fi
  fi

  # print with indent
  printf "%*s%s" $(( $currentIndent * 2 )) # print spaces for the indent count
  echo $line
done <<< "$(cat - | sed 's/></>\n</g')" # separate >< with a newline

इसे स्क्रिप्ट फ़ाइल में पेस्ट करें, और xml में पाइप करें। यह मानता है कि xml सभी एक पंक्ति पर है, और कहीं भी कोई अतिरिक्त स्थान नहीं है। एक आसानी \s*से सुधार करने के लिए कुछ अतिरिक्त जोड़ सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.