XML komut satırından nasıl güzel yazdırılır?


528

İlgili: JSON (unix) kabuk betiğinde nasıl güzel yazdırabilirim?

XML'i insan tarafından okunabilir biçimde biçimlendirmek için bir (unix) kabuk betiği var mı?

Temel olarak, aşağıdakileri dönüştürmesini istiyorum:

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

... böyle bir şeye:

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

1
Sahip olmak xmllintDebian sistemlerde kullanılabilir, paketi yüklemeniz gerekir libxml2-utils( libxml2en azından değil Debian 5.0 "Lenny" ve 6.0 "Squeeze" konulu, bu aracı sağlamaz).
twonkeys

Yanıtlar:


909

libxml2-utils

Bu yardımcı program ile birlikte gelir libxml2-utils:

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

Perl en XML::Twig

Bu komut XML :: Twig ile birlikte gelir modülü, bazen xml-twig-toolspaket:

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

xmlstarlet

Bu komut aşağıdakilerle birlikte gelir xmlstarlet:

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

tidy

tidyPaketi kontrol edin :

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

piton

Python'un xml.dom.minidomkutu biçimi XML (python2 ve python3 ikisi):

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

Gerekenler saxon-lint:

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

saxon-HE

Gerekenler 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'

Güzel, hızlı cevap. İlk seçenek, modern * nix kurulumlarında daha yaygın olacak gibi görünüyor. Küçük bir nokta; ancak bir ara dosya üzerinde çalışmadan çağrılabilir mi? Yani echo '<xml .. />' | xmllint --some-read-from-stdn-option?
svidgen

Paket libxml2-utilsbenim güzel ubuntu.
franzlorenzon

1
"Cat data.xml | xmllint --format - | tee data.xml" çalışmaz. Sistemimde bazen küçük dosyalar için çalıştı, ancak her zaman büyük dosyaları kesdi. Gerçekten yerinde bir şey yapmak istiyorsanız okumaya 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)Python versiyonunda çözmek için aşağıdakileri tanımlayabilirsiniz 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
Düzenli öğenin xml'yi kök öğesi olmadan da biçimlendirebileceğini unutmayın . Bu, bir boru, xml bölümleri (örneğin, günlüklerden ayıklanan) yoluyla biçimlendirmek için yararlıdır. echo '<x></x><y></y>' | tidy -xml -iq
Marinos An

157

xmllint --format yourxmlfile.xml

xmllint bir komut satırı XML aracıdır ve libxml2( http://xmlsoft.org/ ) içine dahil edilmiştir .

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

Not: libxml2Yüklemediyseniz aşağıdakileri yaparak yükleyebilirsiniz:

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

Ubuntu

sudo apt-get install libxml2-utils

Cygwin

apt-cyg install libxml2

Mac os işletim sistemi

Bunu Homebrew ile MacOS'a yüklemek için şunları yapın: brew install libxml2

Git

Kodu isterseniz Git'te de mevcuttur: git clone git://git.gnome.org/libxml2


4
sputnick'in cevabı bu bilgiyi içerir, ancak crmpicco'nun cevabı, XML'in güzel yazdırılmasıyla ilgili genel soruya en yararlı cevaptır.
Seth Difley

2
biz yazabiliriz bazı diğer xml dosyası ve kullanım olduğunu .. mesela xmllint --format yourxmlfile.xml >> yeni-file.xml için biçimlendirilmiş xml çıktı
LearnToLive

2
Ubuntu 16.04'te aşağıdakileri kullanabilirsiniz:sudo apt-get install libxml2-utils
Melle

Bu Windows üzerinde de çalışır; gitWindows için indirmek bile son bir sürümünü yükler xmllint. Örnek:"C:\Program Files\Git\usr\bin\xmllint.exe" --format QCScaper.test@borland.com.cds.xml > QCScaper.test@borland.com.pretty-printed.cds.xml
Jeroen Wiert Pluimers

41

Ayrıca , ilk önce yüklenmesi gerekebilecek düzenli olanları da kullanabilirsiniz (örn. Ubuntu: sudo üzerinde apt-get install tidy).

Bunun için aşağıdaki gibi bir şey yayınlarsınız:

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

Not: birçok okunabilirlik bayrağı vardır, ancak kelime kaydırma davranışı çözmek için biraz can sıkıcıdır ( http://tidy.sourceforge.net/docs/quickref.html ).


1
Yararlı, çünkü xmllint'i tek satırlık bir xml dosyasına satır aralığı eklemek için alamadım. Teşekkürler!
xlttj

tidybenim için de iyi çalışıyor. Bunun aksine hxnormalize, bu aslında <body>etiketi kapatır .
Sridhar Sarnobat

9
BTW, burada faydalı bulmuşsuzdur bazı seçenekler şunlardır: tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes < InFile.xml > OutFile.xml.
Victor Yarema

2
Büyük ipucu @VictorYarema. Ben pygmentize ile kombine ve benim .bashrc ekledi: alias prettyxml='tidy --indent yes --indent-spaces 4 --indent-attributes yes --wrap-attributes yes --input-xml yes --output-xml yes | pygmentize -l xml' ve sonra olabilircurl url | prettyxml
Net Wolf

13

Bir dosyadan bahsetmediniz, bu yüzden XML dizesini komut satırında standart girdi olarak sağlamak istediğinizi varsayalım. Bu durumda, aşağıdakileri yapın:

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

12

MacOS / çoğu Unix'e hiçbir şey yüklemeden.

kullanım tidy

cat filename.xml | tidy -xml -iq

Xml dosya türünü belirtmek ve sessiz çıkış sırasında girintilemek için cat ile bir dosyayı görüntülemeyi yeniden yönlendirmek hata çıktısını bastıracaktır. JSON ile de çalışır -json.


1
Buna gerek yok catadım: tidy -xml -iq filename.xml. Ayrıca, hatta yapabilirsiniz tidy -xml -iq filename.xmlkullanarak -mseçeneği değiştirmek orijinal dosyayı ...
janniks

10

xmllint yerinde biçimlendirme desteği :

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

Daniel Veillard'ın yazdığı gibi:

xmllint -o tst.xml --format tst.xml Ayrıştırıcı, serileştirmek için çıktıyı açmadan önce girdiyi bir ağaca tam olarak yükleyeceği için güvenli olması gerektiğini düşünüyorum .

Girinti seviyesi, XMLLINT_INDENTvarsayılan olarak 2 boşluk olan ortam değişkeni tarafından kontrol edilir . Girintinin 4 boşluğa nasıl değiştirileceğine örnek:

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

--recoverXML belgeleriniz bozulduğunda seçeneğiniz olmayabilir . Veya katı XML çıktısı olan zayıf HTML ayrıştırıcıyı deneyin:

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

--nsclean, --nonet, --nocdata, --noblanksVb yararlı olabilir. Kılavuz sayfasını okuyun.

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

2

Bu beni sonsuza dek Mac bilgisayarımda çalışan bir şey bulmam için aldı. İşte benim için işe yarayan:

brew install xmlformat
cat unformatted.html | xmlformat

1
Yukarıdaki cevabım bir mac üzerinde çalışıyor
jasonleonhard

1

Saf bir Bash çözümü eklemek istiyorum, çünkü bunu sadece elle yapmak zor değil ve bazen işi yapmak için ekstra bir araç yüklemek istemeyeceksiniz.

#!/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

Bir komut dosyasına yapıştırın ve xml'ye ekleyin. Bu, xml'nin tek bir satırda olduğunu ve hiçbir yerde fazladan boşluk olmadığını varsayar. Bunu \s*düzeltmek için normal ifadelere kolayca biraz ekstra ekleyebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.