Более подробный вариант глобали, для разбора хмл файла.

8 views
Skip to first unread message

Alex Z Chudnovsky

unread,
Nov 21, 2009, 6:14:30 AM11/21/09
to m_...@googlegroups.com
СТРУКТУРА ГЛОБАЛИ ПРИ РАБОРЕ ФАЙЛА XML
======================================
 
 @g=nno  ;последний номер элемента, внутренний уникальный номер
 
 @g@(nno,"T")=тип элемента XML,CDATA,Element ... comment
 
 @g@(nno,"N")=наименование елемента без <> my, для некторых типов, может и
              не быть/comment,CDATA../
 
 @g@(nno,"P")=полный путь к елементу в нотации XPATH /my/element/subelement/...
 @g@(nno,"P",nnn)=или в разбивке по елементам если длина >32k, приоритет
                  отдается поддереву;
 @g@(nno,"L")=уровень вложения /глубина, справочно, совпадает с кол-вом
              косых// в "P"/
 
 @g@(nno,"A",название_атрибута)=значение_атрибута
 @g@(nno,"A",название_атрибута,nnn)=значение_атрибута если длина >32к
 
 @g@(nno,"Z")=значение элемента если его длина <32k
 @g@(nno,"Z",nnn)=значение элемента если его длина >32k с разбивкой по строкам
 
 @g@(nno,"*",nno)="" ссылка на елементы которые входят(наследнички) в
    данный елемент.
 

 @g@(nno,"@",nno)="" ссылка на родительские елементы /справочно, для
                     ускорения поиска/
 
 Если значение или атрибуты не опреледено, то некторых элементов может не
 быть. например: "Z","A","*","N"
 
Примеры разбора ХМЛ данныхъ:
 
1. Элемент не имеющий вложений и значений описывется краткой формой:
  <my atr="1" />               или <myno />
 
       ,"T")="ELEMENT"                ,"T")="ELEMENT"
   ... ,"N")="my"                 ... ,"N")="myno"    
       ,"P")="/my"                    ,"P")="/myno"   
       ,"A","atr")=1
 
2. Полная форма:
  <my atr="2">value<my2>value</my2></my>
 
  nno+0,"T")="ELEMENT"
       ,"N")="my"
   ... ,"P")="/my"
       ,"A","atr")=2
       ,"Z")="value"
       ."*",nno+1)=""
  nno+1,"T")="ELEMENT"
       ,"N")="my2"
   ... ,"P")="/my/my2"
       ,"Z")="value"
        "@",nno+0)=""
 
3. Распил CDATA, в данном блоке все елементы действующие, поэтому сохраняем
всё. Пример:
 
<?xml version="1.0" encoding="CP1251"?>
<Export generator="Mumps" version="0.9">
<Document name="mydata"><![CDATA[
#!/perl -w
 
use Net::Telnet ();
my ($hostname, $line, $passwd, $telnet, $username);
$hostname = "127.0.0.1";
$telnet = new Net::Telnet (Telnetmode => 1, Dump_Log   => "t5.log");
$telnet->open(Host => $hostname, Port => 23);
$line = $telnet->getline;
print $line;
$telnet->print("SET A=999 ZW");
print "1:",$telnet->getline;
print "2:",$telnet->getline;
exit;
 
]]></Document></Export>
 

Превращается в указанную ниже структуру:
 
<?xml version="1.0" encoding="CP1251"?>
 
   0,"T")="XML"
    ,"N")="xml"
    ,"P")="/xml"
    ,"A","version")="1.0"
    ,"A","encoding")="CP1251"
 
<Export generator="Mumps" version="0.9">  //начало коневого элемента
 
   1,"T")="ELEMENT"
    ,"N")="Export"
    ,"P")="/Export"
    ,"A","version")="0.9"
    ,"A","generator")="Mumps"
    ,"*",2)=""     //есть вложения
    ,"@",0)=""  //формально корень сам на себя не может ссылатся
</Export>
 
<Document name="mydata">
 
   2,"T")="ELEMENT"
    ,"N")="Document"
    ,"P")="/Export/Document"
    ,"A","name")="mydata"
    ,"Z")=""
    ,"*",3)=""  //есть вложения
    ,"@",1)=""  //родитель здесь, кто нас породил типа
</Document>
 
<![CDATA[ ...
 
   3,"T")="CDATA"
    ,"@",2)=""  //родитель здесь
    ,"P")="/Export/Document/CDATA"
    ,"Z",1)="#!/perl -w"
    ,"Z",2)=""
    ,"Z",3)="use Net::Telnet ();"
    ,"Z",4)="my ($hostname, $line, $passwd, $telnet, $username);"
    ,"Z",5)="$hostname = "127.0.0.1";"
    ,"Z",6)="$telnet = new Net::Telnet (Telnetmode => 1, Dump_Log   => "t5.log");"
    ,"Z",7)="$telnet->open(Host => $hostname, Port => 23);"
    ,"Z",8)="$line = $telnet->getline;"
    ,"Z",9)="print $line;"
    ,"Z",10)="$telnet->print("SET A=999 ZW");"
    ,"Z",11)="print "1:",$telnet->getline;"
    ,"Z",12)="print "2:",$telnet->getline;"
    ,"Z",13)="exit;"
    ,"Z",14)=""
 
]]>
 
 

Eugene Karataev

unread,
Nov 21, 2009, 6:44:15 AM11/21/09
to m_...@googlegroups.com
Вот смотри, есть xml

<root>
<query name=qqq>
<param name=a>aaa</param>
<param name=b>bbb</param>
<param name=c>ccc</param>
</query>
<query name=www>
<param name=a>aaa</param>
<param name=b>bbb</param>
<param name=c>ccc</param>
</query>
</root>

В практическом применении интересуют операции
* проверить существование тега query который дочерний у root
* проверить сколько их
* взять первый тег query и у него найти атрибут name
* у этого тега перечислить его дочерние теги с именем param, найти для
каждого из них значение атрибута name (например a) и значение тега (например
aaa).
* взять n-й тег query
* взять его дочерние теги param

Попробуй или примерить свою схему под операции или поварьируй схему.
Я к тому, чтобы схема раскладки xml в глобали / локали была применимой для
операций.

Евгений Каратаев.

Reply all
Reply to author
Forward
0 new messages