سؤال

لدي هذا ملف XML ضخم يحتوي على الكثير من التعليقات.

ما هي "أفضل طريقة" لتجريد جميع التعليقات وتنسيق XML بشكل جيد من سطر أوامر Linux؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام مرتبة

$ tidy -quiet -asxml -xml -indent -wrap 1024 --hide-comments 1 tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <user username="qwerty" password="ytrewq" roles="manager-gui" />
</tomcat-users>

نصائح أخرى

قم بتشغيل XML الخاص بك من خلال تحول الهوية XSLT، مع قالب فارغ للتعليقات.

سيتم تمرير جميع محتويات XML، باستثناء التعليقات، إلى الإخراج.

من أجل تنسيق الناتج، اضبط الإخراج @ indent = "نعم":

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<!--Match on Attributes, Elements, text nodes, and Processing Instructions-->
<xsl:template match="@*| * | text() | processing-instruction()">
   <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
   </xsl:copy>
</xsl:template>

<!--Empty template prevents comments from being copied into the output -->
<xsl:template match="comment()"/>

</xsl:stylesheet>

قد ترغب في إلقاء نظرة على xmllint أداة. لديها العديد من الخيارات (واحد منها --format سوف تفعل طباعة جميلة)، لكن لا يمكنني معرفة كيفية إزالة التعليقات باستخدام هذه الأداة.

أيضا، تحقق من xmlstarlet., ، مجموعة من أدوات سطر الأوامر للقيام بأي شيء تريده مع XML. ثم القيام:

xml c14n --without-comments # XML file canonicalization w/o comments

تعديل: op في النهاية استخدم هذا الخط:

xmlstarlet c14n --without-comments old.xml > new.xml

لترتيب شيء بسيط مثل Server.xml في Tomcat، أستخدمه

sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$"

بمعنى آخر

function tidy() {
 echo "$( cat $1 | sed 's/<!--/\x0<!--/g;s/-->/-->\x0/g' | grep -zv '^<!--' | tr -d '\0' | grep -v "^\s*$")"
}

tidy server.xml

... سوف تطبع XML دون تعليقات.

ملاحظة: في حين أنه يعمل بشكل جيد بشكل معقول للأشياء البسيطة، إلا أنه سيفشل مع بعض كتل CDATA وبعض المواقف الأخرى. استخدمه فقط للبرامج النصية XML التي تسيطر عليها ليست حاجة ولن تحتاج أبدا إلى الهروب من واحد <-- أو --> في أى مكان!

أول علامات SED علامات تعليق وتوقف مع 0x0 حرفا، ثم GREP -z يعامل 0x0 كحدد السطر الوحيد، يبحث عن خطوط بدءا من التعليق، إنه يتعكس المرشح، وترك خطوط ذات معنى فقط. أخيرا، tr -d0` حذف كل هذه 0x0، وللمانة ترميزه، يزيل Grep آخر خطوط فارغة: فويلا.

أفضل طريقة هي استخدام محلل XML للتعامل مع جميع حالات الزاوية الغامضة بشكل صحيح. ولكن إذا كنت بحاجة إلى شيء سريع وقذرة، فهناك مجموعة متنوعة من حلول قصيرة باستخدام Perl Regexes والتي قد تكون كافية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top