Emre Çamalan'ın Kişisel Güncesi

Ben, sen sen olduğun için, benim!

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`
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 '> ${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}.*?>.*?"
        else

                cat ${TMP2} | grep -Po "<${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}.*?>.*?" | sed 's,.*>\(.*\)<.*,\1,g'
        else

                cat ${TMP2} | grep -Po "<${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}

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


*