2011-11-22 58 views
-3

我有这样如何打印这样的xml数据?

<orderinfo> 
<data> 
    <Id>raj</Id> 
    <Customer>bvr</Customer> 
    <Suppliers> 
    <Supplier Id="svr" /> 
    <Supplier Id="dvr" /> 
<Supplier Id="klr" /> 
</Suppliers> 
</data> 

<data> 
    <Id>svr</Id> 
    <Customer>raj</Customer> 
    <Suppliers> 
    <Supplier Id="avr" /> 
    <Supplier Id="csr" /> 
    <Supplier Id="ksr" /> 
    </Suppliers> 
</data> 

<data> 
    <Id>avr</Id> 
    <Customer>svr</Customer> 
    <Suppliers> 
    <Supplier Id="Bpv" /> 
    <Supplier Id="Wrr" /> 
    <Supplier Id="Sdr" /> 
    </Suppliers> 
</data> 

<data> 
    <Id>csr</Id> 
    <Customer>svr</Customer> 
    <Suppliers> 
    <Supplier Id="bvs" /> 
    <Supplier Id="vvs" /> 
    <Supplier Id="Ssv" /> 
    </Suppliers> 
</data> 

<data> 
    <Id>klr</Id> 
    <Customer>PUMC</Customer> 
    <Suppliers> 
    <Supplier Id="ssn" /> 
    <Supplier Id="qis" /> 
    <Supplier Id="nan" /> 
    </Suppliers> 
</data> 
</orderinfo> 

上面的XML XML文件reprents供应商客户relationship.I需要寻找客户标签数据不等于任何数据节点的ID标签,然后客户是顶级客户。 如果我们发现顶级客户,然后打印该节点ID,然后打印该节点供应商ID。基于该节点的每个供应商ID,我需要匹配此供应商ID与 所有节点的任何Id标签匹配,如果匹配发现打印该节点供应商Id的。如果没有找到匹配就离开那个供应商ID。我需要重复相同的程序,然后我将 得到顶级客户与底层供应商之间的关系。

在我需要打印这样

        bvr 

            raj 
        svr    dvr   klr 
     avr   csr  ksr (empty) ssn qis nan 
(bpv wrr sdr) (bvs vvs ssv) 

这里“超视距”上述XML数据是顶级客户,因为它不等于数据节点的任何ID标签。然后打印这是顶部customer.next打印该节点ID和该节点供应商ID的。 现在使用这个供应商ID进行匹配,匹配每个供应商Id等于任何数据节点的Id标签,在这个例子中“supplier Id =”svr“”等于第二个数据节点“Id” 然后打印该供应商Id's。然后去搜索相同的程序来重新标记顶级用户的供应商ID。在该示例中,第二供应商Id“dvr”与任何 数据节点Id都不匹配,因此只打印该数据节点。第三供应商Id与最后的数据节点Id匹配,因此打印最后的数据供应商Id。然后现在去“svr供应商Id的做同样的程序。

只是我在图表表示形式了解。我怎样才能打印这个标签元素数据像这样。 请帮助我的人,因为我很初学。它的很复杂,我

+1

您的“XML”无效。 XML需要一个根元素。 – tadmc

+0

所以这个问题分解成两部分。 1 /将XML转换为合适的节点树。 2 /将这棵树变成某种图形表示。你到底在哪里?到目前为止,你有什么? –

+0

@帮助我与转换XML到节点树。 – user1058595

回答

0

对于初学者来说,可以使用XML::LibXML解析您的XML并将其转换成DOM树,见下面的例子加载的Id标签的例子并打印值:。

use XML::LibXML; 

my $dom = XML::LibXML->load_xml(location => 'filename.xml'); 
my $root = $dom->documentElement(); 
for my $data ($root->findnodes('data')) { 
    print $data->findvalue('Id'), "\n"; 
} 

查找到XML::LibXML::NodeXML::LibXML::Element提供了访问数据和遍历的可用方法。