Extract the specific tags in a XML file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Extract the specific tags in a XML file
# 1  
Old 10-10-2017
Code Extract the specific tags in a XML file

Hello Shell Gurus,

I have a requirement to get the specific tags from a XML file.
Here is my code snippet

Code:
<jdbc-system-resource>
    <name>SDPData Source</name>
    <target>AdminServer,osb_server1,soa_server1</target>
    <descriptor-file-name>jdbc/SDPData_Source-1102-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>
  <jdbc-system-resource>
    <name>94machineDB</name>
    <target>soa_server1</target>
    <descriptor-file-name>jdbc/94machineDB-5930-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>

Here i have to avoid where <name> contains SDP and rest i have to write into new file.
Eg:-
IN this case, i have to get a new file like below.
Code:
  <jdbc-system-resource>
    <name>94machineDB</name>
    <target>soa_server1</target>
    <descriptor-file-name>jdbc/94machineDB-5930-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>

Any help will be extreemly appreciated.
# 2  
Old 10-10-2017
Hello Siv51427882,

Could you please try following and let me know if this helps you.
Code:
awk '/<jdbc-system-resource>/{non_flag=val="";flag=1} /<\/jdbc-system-resource>/ && !non_flag{print val RS $0;val=flag="";next} non_flag{next} flag && /SDP/{non_flag=1;val="";next} flag && NF{val=val?val ORS $0:$0}'  Input_file

Output will be as follows.
Code:
  <jdbc-system-resource>
    <name>94machineDB</name>
    <target>soa_server1</target>
    <descriptor-file-name>jdbc/94machineDB-5930-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>

EDIT: Adding a non-one liner form of solution too now.
Code:
awk '
/<jdbc-system-resource>/{
  non_flag=val="";
  flag=1
}
/<\/jdbc-system-resource>/ && !non_flag{
  print val RS $0;
  val=flag="";
  next
}
non_flag{
  next
}
flag && /SDP/{
  non_flag=1;
  val="";
  next
}
flag && NF{
  val=val?val ORS $0:$0
}
'   Input_file

Thanks,
R. Singh
This User Gave Thanks to RavinderSingh13 For This Post:
# 3  
Old 10-10-2017
Using python:-
Code:
import xml.etree.ElementTree as ET

tree = ET.parse('input.xml')

root = tree.getroot()

for jdbc in root.findall('jdbc-system-resource'):
    name = jdbc.find('name').text
    if ( "SDP" in name ):
        root.remove(jdbc)

tree.write('output.xml')

This User Gave Thanks to Yoda For This Post:
# 4  
Old 10-11-2017
Hello R.Singh&Yoda,

I have another problem here.
Kindly consider the below code,
Code:
 <jdbc-system-resource>
    <name>EDNLocalTxDataSource</name>
    <target>soa_server1</target>
    <descriptor-file-name>jdbc/EDNLocalTxDataSource-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>
  <jdbc-system-resource>
    <name>SOALocalTxDataSource</name>
    <target>soa_server1</target>
    <descriptor-file-name>jdbc/SOALocalTxDataSource-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>
  <jdbc-system-resource>
    <name>mds-soa</name>
    <target>AdminServer,soa_server1</target>
    <descriptor-file-name>jdbc/mds-soa-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>
  <jdbc-system-resource>
    <name>aqjmsuserDataSource</name>
    <target>soa_server1</target>
    <descriptor-file-name>jdbc/aqjmsuserDataSource-1696-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>

IN the Above code, i have to avoid the <jdbc-system-resources> entries for which <name> contains "SOA" or "soa" or "EDN" or "mds" or "SDP" or "sdp"

for the above code, i would like to get an output like below.

Code:
  <jdbc-system-resource>
    <name>aqjmsuserDataSource</name>
    <target>soa_server1</target>
    <descriptor-file-name>jdbc/aqjmsuserDataSource-1696-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>
  <jdbc-system-resource>

BTW, Thanks for you kind help. your suggestions are lot for me.

Thanks,
Siva
# 5  
Old 10-11-2017
Hello Siv51427882,

Could you please try following and let me know if this helps you.
Code:
awk '
/<jdbc-system-resource>/{
  non_flag=val="";
  flag=1
}
/<\/jdbc-system-resource>/ && !non_flag{
  print val RS $0;
  val=flag="";
  next
}
non_flag{
  next
}
flag && /<name>/ && (/SDP/ || /sdp/ || /SOA/ || /soa/ || /EDN/ || /mds/){
  non_flag=1;
  val="";
  next
}
flag && NF{
  val=val?val ORS $0:$0
}
'  Input_file

Output will be as follows.
Code:
  <jdbc-system-resource>
    <name>aqjmsuserDataSource</name>
    <target>soa_server1</target>
    <descriptor-file-name>jdbc/aqjmsuserDataSource-1696-jdbc.xml</descriptor-file-name>
  </jdbc-system-resource>

Thanks,
R. Singh
This User Gave Thanks to RavinderSingh13 For This Post:
# 6  
Old 10-11-2017
Hello R.Singh,

Thanks for your kind help on this.
now, i have another xml file(DataSourceTest-8855-jdbc.xml) in different location.
i would like to access this file and write the contents into another file.
For Example
Here is the file i am taking about.
Code:
<?xml version='1.0' encoding='UTF-8'?>
<jdbc-data-source>
  <name>DataSourceTest</name>
  <jdbc-driver-params>
    <url>jdbc:oracle:thin:@10.137.181.188:1521/soa12cdb</url>
    <driver-name>oracle.jdbc.xa.client.OracleXADataSource</driver-name>
    <properties>
      <property>
        <name>user</name>
        <value>DEV_SOAINFRA</value>
      </property>
    </properties>
    <password-encrypted>{AES}xxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=</password-encrypted>
  </jdbc-driver-params>
  <jdbc-connection-pool-params>
    <initial-capacity>0</initial-capacity>
    <test-table-name>SQL SELECT 1 FROM DUAL</test-table-name>
  </jdbc-connection-pool-params>
  <jdbc-data-source-params>
    <jndi-name>jdbc/SOADBDataSource</jndi-name>
  </jdbc-data-source-params>
</jdbc-data-source>

we would like to get the output file as below format
Code:
Parameter1=DataSourceTest
Parameter2=jdbc:oracle:thin:@10.137.181.188:1521/soa12cdb
like parameter3,etc

And sorry for keep bothering you as i am new to shell and trying to explore it.

Thanks
Siva

Last edited by Scrutinizer; 10-20-2017 at 03:41 AM..
# 7  
Old 10-11-2017
Hello Siv51427882,

Your request is NOT totally clear, could you please try following and let me know if this helps.
Code:
awk -F"[><]" '/<\/jdbc-data-source>/{print "Parameter1="para1 RS "Parameter2="para2;para1=para2=""} /<jdbc-data-source>/{getline;para1=$3;next} /<driver-name>/{para2=$3;next}'  Input_file

Output will be as follows.
Code:
Parameter1=DataSourceTest
Parameter2=oracle.jdbc.xa.client.OracleXADataSource

EDIT: Adding a non-one liner form of solution too now.
Code:
awk -F"[><]" '
/<\/jdbc-data-source>/{
  print "Parameter1="para1 RS "Parameter2="para2;
  para1=para2=""
}
/<jdbc-data-source>/{
  getline;
  para1=$3;
  next
}
/<driver-name>/{
  para2=$3;
  next
}
'   Input_file

Thanks,
R. Singh
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

How to pull multiple XML tags from the same XML file in Shell.?

I'm searching for the names of a TV show in the XML file I've attached at the end of this post. What I'm trying to do now is pull out/list the data from each of the <SeriesName> tags throughout the document. Currently, I'm only able to get data the first instance of that XML field using the... (9 Replies)
Discussion started by: hungryd
9 Replies

2. UNIX for Beginners Questions & Answers

How can we extract specific elements from XML?

Hi, I have a requirement to extract specific element value dynamically from XML message. Here is the sample message: <File> <List> <main> <dir>doc/store834/archive</dir> <count>5</count> </main> <main> <dir>doc/store834/extract</dir> <count>6</count> </main> <main> ... (3 Replies)
Discussion started by: renukeswar
3 Replies

3. Shell Programming and Scripting

Parse xml in shell script and extract records with specific condition

Hi I have xml file with multiple records and would like to extract records from xml with specific condition if specific tag is present extract entire row otherwise skip . <logentry revision="21510"> <author>mantest</author> <date>2015-02-27</date> <QC_ID>334566</QC_ID>... (12 Replies)
Discussion started by: madankumar.t@hp
12 Replies

4. Shell Programming and Scripting

Extract specific line in an html file starting and ending with specific pattern to a text file

Hi This is my first post and I'm just a beginner. So please be nice to me. I have a couple of html files where a pattern beginning with "http://www.site.com" and ending with "/resource.dat" is present on every 241st line. How do I extract this to a new text file? I have tried sed -n 241,241p... (13 Replies)
Discussion started by: dejavo
13 Replies

5. Shell Programming and Scripting

Extract a particular xml only from an xml jar file

Hi..need help on how to extract a particular xml file only from an xml jar file... thanks! (2 Replies)
Discussion started by: qwerty000
2 Replies

6. Shell Programming and Scripting

Shell script to extract data in repeating tags from xml

Hi, I am new to shell scripting. I need to extract data between repeating tags from an xml file and store the data in an array to process it further. <ns1:root xmlns:ns1="http://example.com/config"> <ns1:interface>in1</ns1:interface> <ns1:operation attribute1="true" attribute2="abd"... (2 Replies)
Discussion started by: sailendra
2 Replies

7. Shell Programming and Scripting

How to add the multiple lines of xml tags before a particular xml tag in a file

Hi All, I'm stuck with adding multiple lines(irrespective of line number) to a file before a particular xml tag. Please help me. <A>testing_Location</A> <value>LA</value> <zone>US</zone> <B>Region</B> <value>Russia</value> <zone>Washington</zone> <C>Country</C>... (0 Replies)
Discussion started by: mjavalkar
0 Replies

8. Shell Programming and Scripting

bash extract all occurences delimited from <name> and </name> tags from an xml file

I need to extract all text delimited from <name> and </name> tags from an xml file, but not only first occurence. I need to extract all occurences. I've tried with this command: awk -F"<name>|</name>" 'NF>2{print $2}' but it give only first occurence. How can i modify it? (18 Replies)
Discussion started by: ingalex
18 Replies

9. UNIX for Dummies Questions & Answers

Extract a specific number from an XML file based on the start and end tags

Hello People, I have the following contents in an XML file ........... ........... .......... ........... <Details = "Sample Details"> <Name>Bob</Name> <Age>34</Age> <Address>CA</Address> <ContactNumber>1234</ContactNumber> </Details> ........... ............. .............. (4 Replies)
Discussion started by: sushant172
4 Replies

10. Shell Programming and Scripting

extract specific data from xml format file.

Hi, I need to extract the start time value (bold, red font) under the '<LogEvent ID="Timer Start">' tag (black bold) from a file with the following pattern. There are other LogEventIDs listed in the file as well, making it harder for me to extract out the specific start time that I need. . .... (7 Replies)
Discussion started by: 60doses
7 Replies
Login or Register to Ask a Question