কমান্ড লাইন থেকে XML কীভাবে প্রিন্ট করবেন?


526

সম্পর্কিত: আমি কীভাবে JSON (ইউনিক্স) শেল স্ক্রিপ্টে প্রিন্ট করতে পারি?

মানব-পঠনযোগ্য আকারে এক্সএমএল ফর্ম্যাট করার জন্য কি (ইউনিক্স) শেল স্ক্রিপ্ট রয়েছে?

মূলত, আমি এটি নিম্নলিখিত রূপান্তর করতে চাই:

<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 "স্কিজে" না)।
twonkeys

উত্তর:


908

libxml2-utils

এই ইউটিলিটিটি সাথে আসে libxml2-utils:

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

পার্ল এর 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.minidomপাইথনগুলি এক্সএমএল ফর্ম্যাট করতে পারে ( পাইথন 2 এবং পাইথন 3):

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,?
এসভিডজেন

প্যাকেজটি libxml2-utilsআমার সুন্দর উবুন্টুতে রয়েছে।
ফ্রানজ্লোরেঞ্জন

1
লক্ষ্য করুন যে "বিড়াল ডেটা.এক্সএমএল | এক্সমিলিন্ট - ফর্ম্যাট - | টি ডেটা.এক্সএমএল" কাজ করে না। আমার সিস্টেমে এটি কখনও কখনও ছোট ফাইলগুলির জন্য কাজ করে তবে সর্বদা বিশাল ফাইলগুলি কেটে যায়। আপনি যদি সত্যিই জায়গায় কিছু করতে চান তবে backreferences.org/2011/01/29/in-place-editing-of-files পড়ুন
ব্যবহারকারী 1346466

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
ফেলিকজেড

1
নোট করুন যে পরিপাটি কোনও মূল উপাদান ছাড়াই এক্সএমএল ফর্ম্যাট করতে পারে । এটি পাইপ, এক্সএমএল বিভাগগুলির (যেমন লগগুলি থেকে নিষ্কাশিত) মাধ্যমে ফর্ম্যাট করতে দরকারী। echo '<x></x><y></y>' | tidy -xml -iq
মেরিনোস আন

157

xmllint --format yourxmlfile.xml

xmllint একটি কমান্ড লাইন এক্সএমএল সরঞ্জাম এবং এটি অন্তর্ভুক্ত করা হয়েছে libxml2( http://xmlsoft.org/ ) /

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

দ্রষ্টব্য: আপনি যদি libxml2ইনস্টল না করে থাকেন তবে নিম্নলিখিতগুলি করে এটি ইনস্টল করতে পারেন:

সেন্টওএস

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 clone git://git.gnome.org/libxml2


4
স্পটনিকের উত্তরে এই তথ্য রয়েছে, তবে এক্সএমএলটি কীভাবে প্রিন্ট করা যায় সে সম্পর্কে সাধারণ প্রশ্নের এখানে ক্রম্পিকোর উত্তরটি সবচেয়ে দরকারী উত্তর।
শেঠ ডিফলি

2
আমরা সেই ফর্ম্যাট এক্সএমএল আউটপুটটি অন্য কোনও এক্সএমএল ফাইলে লিখতে পারি এবং এটি ব্যবহার করতে পারি eg উদাহরণস্বরূপ xmllint --format yourxmlfile.xml >> new-file.xML
শিখুনগ্রাহী

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

আপনি পরিপাটিও ব্যবহার করতে পারেন , যা প্রথমে ইনস্টল করার প্রয়োজন হতে পারে (যেমন উবুন্টু: সুডোর উপর apt-get install tidy)।

এই জন্য, আপনি নিম্নলিখিত মত কিছু ইস্যু করবে:

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

দ্রষ্টব্য: অতিরিক্ত অতিরিক্ত পাঠযোগ্যতার পতাকা রয়েছে, তবে শব্দের-মোড়কের আচরণটি আনট্যাঙ্গেল ( http://tidy.sourceforge.net/docs/quickref.html ) এর জন্য কিছুটা বিরক্তিকর ।


1
সহায়ক, কারণ আমি একক লাইনের এক্সএমএল ফাইলটিতে লাইনব্র্যাকগুলি যুক্ত করতে এক্সমিলিন্টটি পেতে পারি নি। ধন্যবাদ!
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
দুর্দান্ত টিপ @ ভিক্টর ইয়ারেমা। আমি এটি পাইগম্যানটাইজের সাথে একত্রিত করেছি এবং এটি আমার .বাশক্রিতে যুক্ত করেছি: 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

ম্যাকোস / সর্বাধিক ইউনিক্সে কিছু ইনস্টল না করে।

ব্যবহার tidy

cat filename.xml | tidy -xml -iq

এক্সএলএমএল ফাইলের ধরণ নির্দিষ্ট করে পরিষ্কার করার জন্য এবং শান্ত আউটপুট ত্রুটি আউটপুটকে দমন করবে এমন সময় বিড়ালের সাথে একটি ফাইল দেখা পুনর্নির্দেশ করা। জেএসওএনও কাজ করে -json


1
আপনি প্রয়োজন হবে না catপদক্ষেপ: tidy -xml -iq filename.xml। এছাড়াও, আপনি মূল ফাইলটি সংশোধন করার বিকল্পটি tidy -xml -iq filename.xmlব্যবহার করেও করতে পারেন ...-m
জান্নিকস

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যখন এক্সএমএল নথিগুলি ভেঙে ফেলেন তখন আপনার বিকল্পের অভাব থাকতে পারে । বা কঠোর এক্সএমএল আউটপুট সহ দুর্বল এইচটিএমএল পার্সার ব্যবহার করে দেখুন:

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
আমার উপরের উত্তরটি ম্যাক
জেসনলনহার্ড

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

এটি একটি স্ক্রিপ্ট ফাইলে পেস্ট করুন, এবং এক্সএমএলে পাইপ। এটি ধরে নেয় যে এক্সএমএল সমস্ত এক লাইনে রয়েছে এবং কোথাও কোনও অতিরিক্ত স্থান নেই। \s*এটি ঠিক করার জন্য কেউ সহজেই রেগেক্সগুলিতে কিছু অতিরিক্ত যোগ করতে পারে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.