need help on xml processing


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting need help on xml processing
# 1  
Old 08-04-2008
need help on xml processing

I am trying to divide a xml file(my.xml) like this:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<Proto PName="hmmmmmmm">
     <Menu id="A" ver="1">
         <P>
             <P name="AA" Type="X"/>
             <P name="BB" Type="Y"/>
             <P name="CC" Type="Z"/>
         </P>
         <main>
             <K name="DD" type="X"/>
             <K name="EE" type="Y"/>
         </main>
     </Menu>
    <Menu id="B" ver="1">
        <P>
            <P name="XX" Type="X"/>
            <P name="BB" Type="Y"/>
            <P name="CC" Type="Z"/>
        </P>
        <main>
            <K name="DD" type="X"/>
            <K name="EE" type="Y"/>
        </main>
    </Menu>
    <Menu id="C" ver="1">
         <P>
             <P name="ZZ" Type="X"/>
             <P name="BB" Type="Y"/>
             <P name="CC" Type="Z"/>
         </P>
         <main>
             <K name="DD" type="X"/>
             <K name="EE" type="Y"/>
         </main>
     </Menu>
</Proto>

I am trying to get 3 files out of the above. .i.e.

Code:
$ cat my.A.xml
<?xml version="1.0" encoding="UTF-8"?>
<Proto PName="hmmmmmmm">
    <Menu id="A" ver="1">
        <P>
            <P name="AA" Type="X"/>
            <P name="BB" Type="Y"/>
            <P name="CC" Type="Z"/>
        </P>
        <main>
            <K name="DD" type="X"/>
            <K name="EE" type="Y"/>
        </main>
    </Menu>
</Proto>


$ cat my.B.xml
<?xml version="1.0" encoding="UTF-8"?>
<Proto PName="hmmmmmmm">
    <Menu id="B" ver="1">
        <P>
            <P name="XX" Type="X"/>
            <P name="BB" Type="Y"/>
            <P name="CC" Type="Z"/>
        </P>
        <main>
            <K name="DD" type="X"/>
            <K name="EE" type="Y"/>
        </main>
    </Menu>
</Proto>

and similarly my.C.xml

I tried this: 

$ awk '/<Menu id=/,/<\/Menu>/' my.xml

is there any way available other than perl for this xml processing.
# 2  
Old 08-04-2008
You can do something like that with awk:
Code:
awk -F'"'  '

/<\?xml/ {
   header = $0;
}

/<Proto/ {
   proto = $0;
}

/[[:space:]]*<Menu/ {
   Id = $2;
   OutXml = Out
   gsub(/?/, Id, OutXml);
   print header > OutXml;
   print proto  > OutXml;
}

OutXml {
   print > OutXml
}

/[[:space:]]*<\/Menu/ {
   if (OutXml) {
      print "</Proto>" > OutXml;
      close(OutXml);
   }
   OutXml = "";
}

' Out='my.?.xml' my.xml

The variable Out is the model for output file names, '?' stands for the Menu Id.

Jean-Pierre.
# 3  
Old 08-04-2008
... or XSLT.
# 4  
Old 08-04-2008
using Perl:
Code:
#!/usr/bin/perl
use strict;
use warnings;
# separate_xml_protos.pl
my $filename = shift;
open (X_FILE, '<', $filename)  or  die "Failed to read file $filename : $!";
{
    local $/;
    while (<X_FILE>) {
        my $x;
        if (m/(<\?xml (.*?)\?>)/) {
            $x = $1;
        }
        my $proto;
        if (m/(<Proto (.*?)>)/) {
            $proto = $1;
        }
        while (m#(<Menu id="(.*?)"(.*?)</Menu>)#gs) {
            print "\n\n", $2, "\n";
            my $newfile = "my." . $2 . ".xml";
            open (NEW_XML, '>', $newfile)  or  die "Failed to write file";
            print NEW_XML $x, "\n", $proto, "\n", $1, "\n</Proto>\n";
            close NEW_XML;
        }
    }
}
close (X_FILE);

run this script as:
Code:
perl separate_xml_protos.pl my.xml

# 5  
Old 08-04-2008
Using XSLT ....
Code:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                extension-element-prefixes="exsl"
                version="1.0">

<xsl:template match="Menu">
   <exsl:document href="{@id}.xml" method="xml">
      <Proto PName="hmmmmmmm">
          <xsl:copy-of select="." />
      </Proto>
   </exsl:document>
</xsl:template>

</xsl:stylesheet>

Login or Register to Ask a Question

Previous Thread | Next Thread

8 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

General Purpose XML Processing

I've been kicking this around for a while now, I might as well post it here. v0.0.9, now properly supporting self-closing tags. v0.0.8, an important quoting fix and a minor change which should handle special <? <!-- etc. tags without seizing up as often. Otherwise the code hasn't changed much.... (6 Replies)
Discussion started by: Corona688
6 Replies

2. Programming

awk processing / Shell Script Processing to remove columns text file

Hello, I extracted a list of files in a directory with the command ls . However this is not my computer, so the ls functionality has been revamped so that it gives the filesizes in front like this : This is the output of ls command : I stored the output in a file filelist 1.1M... (5 Replies)
Discussion started by: ajayram
5 Replies

3. Shell Programming and Scripting

processing xml with awk

With the following input sample extracted from a xml file <rel ver="123"> <mod name="on"> <node env="ac" env="1"> <ins ip="10.192.0.1"/> <ins ip="10.192.0.2"/> ... (1 Reply)
Discussion started by: cabrao
1 Replies

4. Shell Programming and Scripting

Help with XML file processing

I need to get all session_ID 's for product="D-0002" from a XML file: Sample input: <session session_ID="6411206" create_date="2012-04-10-10.22.13.000000"> <marketing_info> <program_id>D4AWFU</program_id> <subchannel_id>abc</subchannel_id> </marketing_info> ... (1 Reply)
Discussion started by: karumudi7
1 Replies

5. Programming

help me with perl script xml processing

Hi everyone, I have Xml files in a folder, I need to extract some attribute values form xml files and store in a hash. My xml file look like this. <?xml version="1.0" encoding="UTF-8"?> <Servicelist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"... (0 Replies)
Discussion started by: pavani reddy
0 Replies

6. Shell Programming and Scripting

How to make parallel processing rather than serial processing ??

Hello everybody, I have a little problem with one of my program. I made a plugin for collectd (a stats collector for my servers) but I have a problem to make it run in parallel. My program gathers stats from logs, so it needs to run in background waiting for any new lines added in the log... (0 Replies)
Discussion started by: Samb95
0 Replies

7. Shell Programming and Scripting

CSV processing to XML

Hi, i am really fresh with shell scripting and programming, i have an issue i am not able to solve to populate data on my server for Cisco IP phones. I have CSV file within the following format: ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;... (9 Replies)
Discussion started by: angel2008
9 Replies

8. Shell Programming and Scripting

Shell Script syntax for XML processing

Hi All, I am new to Shell scripting. I have a log file containing XML Messages.Each XML Message is accompanied with a timestamp.I need to count the the number of messages that get logged in a particular timeinterval.Is there any command/Syntax to achieve this. Any code/example is... (5 Replies)
Discussion started by: vignesh53
5 Replies
Login or Register to Ask a Question