Bash: Xml Parser
Open Source projelere destek olmak amacıyla en kısa süreçte bitmesi ümidiyle:
https://github.com/ShyRain/XmlParser
Bash XML Parser’ın ilk Prototipi (28.1.2013)
Download BashXmlParser (bxp 32)
(32 Bit Ubuntu için Compile Edilmiştir..)
(Bash Shell’de kullanım için oluşturulmuştur.)
~# file bxp bxp: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x62ec2299a522efdead33ace8f2492ff89980fea1, stripped
Download BashXmlParser (bxp 64)
(64 Bit Ubuntu için Compile Edilmiştir..)
(Bash Shell’de kullanım için oluşturulmuştur.)
~# file /usr/sbin/bxp /usr/sbin/bxp: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x8478ffe0178b9fc4ae60c92318eefefac9f0c797, stripped
Yükleme
indirdiğiniz bxp binary dosyasını /usr/sbin altına kopyalayıp çalıştırılabilir izni verin.
~# sudo su ~# cp bxp /usr/sbin/ ~# chmod +x /usr/sbin/bxp
artık komut satırında istediğiniz yerde bxp komutunu kullanabilirsiniz.
Kullanım:
V1 ‘deki özellikleri oldukça kısıtlıdır:
~# bxp dene.xml -tc 'from' 1 ~# <from>Jani</from> ~# bxp dene.xml -tcw 'from' 1 ~# Jani
bxp komutundan sonra dosya adını yazıyoruz, aynı klasör de değilse tam dosya yolunu yazmayı unutmayın.
Sonra -tc yada -tcw parametreleri ile “tag content” yada “tag content without” kısaltmalarıyla tagların içeriğini çekiyoruz.
-tc kullanılırsa yanlarındaki taglarıda birlikte gelir
-tcw kullanılırsa tagsız saf hali gelir.
Sonra kullanmak istediğiniz parametreyi yazın ben dene.xml içerisindeki from tag’ını aldım.
Son olarak sondaki 1’de from tag’ını kullanan childe ‘den fazla olduğu için ben ilk tag’ın arasındaki content’e ulaştım..
Download dene.xml (örnek dosya)
Lütfen Öneri ve Yorumlarını Ekleyerek Gelişmesine Katkıda Bulunun…
EK: 08.05.2013
Bir takım farklı bilgisayarlarda denedikten sonra her zaman çalışmadığını görerek Bash Script Olarak Source kodunu vermeye karar verdim.
Ancak source code’da her işletim sisteminde aynı tepkiyi vermemektedir.
Örneğin Centos ve Ubuntu farklı sonuçlar vermektedir. En azından sizin için bir başlangıç olabilir.
#!/bin/bash
XMLFILE=$1
TMP="/tmp/xml.txt"
TMP1="/tmp/xml1.txt"
TMP2="/tmp/xml2.txt"
TMP3="/tmp/xml3.txt"
TREE="/tmp/tree.txt"
## remove all txt
rm -rf ${TMP} ${TMP2} ${TMP3} ${TREE}
##tek satıra indirgedik
cat ${XMLFILE} | tr -d '\n' > ${TMP}
##xml header'ını sil
dummy=`cat ${TMP} | grep '\|?>' | head -1`
if [ -n "${dummy}" ]
then
vContent=`cat ${TMP} | sed -n 's/.*\(.*?>\).*/\1/p'`
cat ${TMP} | sed "s,$vContent,,g" > ${TMP2}
fi
##xml yorumlarını sil
dummy=`cat ${TMP2} | grep '' | head -1`
if [ -n "${dummy}" ]
then
cat ${TMP2} | grep -Po '' > ${TMP3}
while read item
do
cat ${TMP2} | sed "s,$item,,g" > ${TMP}
mv ${TMP} ${TMP2}
done < ${TMP3}
fi
##Tagları çıkartalım
sTag=`cat ${TMP2} | grep -Po '<.*?>' | grep -v '' | wc -l`
fTag=`cat ${TMP2} | grep -Po '' | wc -l`
if [ "${sTag}" != "${fTag}" ]
then
echo 'Bozuk XML Dosyası'
exit 1;
fi
cat ${TMP2} | grep -Po '<.*?>' > ${TMP}
##cat ${TMP} all tag
no=0
while read tag
do
x=`echo ${tag} | grep ''`
if [ -z "$x" ]
then
let no=$((no+1))
echo ${tag}"##"${no} >> ${TREE}
else
echo ${tag}"##"${no} >> ${TREE}
let no=$((no-1))
fi
done < ${TMP}
###### Parametreye Göre Cevap hazırlanacak
if [ $# -lt 2 ]
then
echo "Usage : bxp name.xml -r -p -2"
exit
fi
#count=2
#while [[ $count -le $# ]]
#do
# echo "$count"
# (( count++ ))
#done
###############
case "$2" in
-tc)
TAG=$3
TAGNO=$4
no=`cat ${TMP} | grep "${TAG}" | wc -l`
if [ $no -eq 2 ]
then
cat ${TMP2} | grep -Po "<${TAG}.*?>.*?${TAG}>"
else
cat ${TMP2} | grep -Po "<${TAG}.*?>.*?${TAG}>" > ${TMP1}
cat "${TMP1}" | head -${TAGNO} | tail -1
fi
;;
-tcw)
TAG=$3
TAGNO=$4
no=`cat ${TMP} | grep "${TAG}" | wc -l`
if [ $no -eq 2 ]
then
cat ${TMP2} | grep -Po "<${TAG}.*?>.*?${TAG}>" | sed 's,.*>\(.*\)<.*,\1,g'
else
cat ${TMP2} | grep -Po "<${TAG}.*?>.*?${TAG}>" > ${TMP1}
cat "${TMP1}" | head -${TAGNO} | tail -1 | sed 's,.*>\(.*\)<.*,\1,g'
fi
;;
*)
echo "Author : Emre Çamalan"
;;
esac
##########################################
## remove all txt
rm -rf ${TMP} ${TMP2} ${TMP3} ${TREE}
CCNA: Ağlar Arası İletişimin Temelleri FreeBSD: ZFS diski GELI ile şifreleme