Разбор XML-комментариев в Oracle

Возможный дубликат:
разбор XML в oracle pl/sql

В приведенном ниже XML мне нужно получить комментарий "ADOR Acknowledgement 2"

Не могли бы вы помочь мне получить это

<?xml version="1.0" encoding="utf-8"?> 
<!--ADOR Acknowledgement 2-->  
<AckTransmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.irs.gov/efile">
<TransmissionHeader recordCount="1">  
<Jurisdiction>ALABAMA</Jurisdiction>  
<TransmissionId>1946157056</TransmissionId>    
<Timestamp>2012-08-16T01:25:47-05:00</Timestamp> 
<Transmitter>      
  <ETIN>00000</ETIN>     
</Transmitter>  
<ProcessType>T</ProcessType>  
<AgentIdentifier>ACK</AgentIdentifier> 
</TransmissionHeader> 
<Acknowledgement> 
  <SubmissionId>X1684956672</SubmissionId> 
  <EFIN>X16849</EFIN>  
  <GovernmentCode>ALST</GovernmentCode> 
  <SubmissionType>XMLTOM</SubmissionType>
  <TaxYear>9999</TaxYear>  
  <SubmissionCategory>MFET</SubmissionCategory>   
  <AcceptanceStatus>A</AcceptanceStatus>  
  <ContainedAlerts>0</ContainedAlerts>    
  <StatusDate>2012-08-16</StatusDate>   
</Acknowledgement> 
</AckTransmission>

person user1609859    schedule 20.08.2012    source источник


Ответы (3)


Комбинация выражений replace, extract и xpath может сделать:

select 
replace(replace(
extract(
xmltype (q'{<?xml version="1.0" encoding="utf-8"?> 
<!--ADOR Acknowledgement 2-->  
<AckTransmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.irs.gov/efile">
<TransmissionHeader recordCount="1">  
<Jurisdiction>ALABAMA</Jurisdiction>  
<TransmissionId>1946157056</TransmissionId>    
<Timestamp>2012-08-16T01:25:47-05:00</Timestamp> 
<Transmitter>      
  <ETIN>00000</ETIN>     
</Transmitter>  
<ProcessType>T</ProcessType>  
<AgentIdentifier>ACK</AgentIdentifier> 
</TransmissionHeader> 
<Acknowledgement> 
  <SubmissionId>X1684956672</SubmissionId> 
  <EFIN>X16849</EFIN>  
  <GovernmentCode>ALST</GovernmentCode> 
  <SubmissionType>XMLTOM</SubmissionType>
  <TaxYear>9999</TaxYear>  
  <SubmissionCategory>MFET</SubmissionCategory>   
  <AcceptanceStatus>A</AcceptanceStatus>  
  <ContainedAlerts>0</ContainedAlerts>    
  <StatusDate>2012-08-16</StatusDate>   
</Acknowledgement> 
</AckTransmission>}'),
'/descendant::comment()'
), '<!--'), '-->') as comment_
from dual;
person René Nyffenegger    schedule 20.08.2012

вот код для разбора комментария из xml.

import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;



import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

public class ParseComment {

public static void xmlParser(String xmlString) {
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory
            .newInstance();
    Document document = null;
    try {
        DocumentBuilder documentBuilder = builderFactory
                .newDocumentBuilder();
        InputSource source = new InputSource();
        source.setCharacterStream(new StringReader(xmlString));
        document = documentBuilder.parse(source);
        NodeList nodes = document.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
            if (nodes.item(i) instanceof Element) {
                Element element = (Element) nodes.item(i);
                /* add your logic to parse element values here.*/
                System.out.println("Element : " + element.getTextContent());// nodes.item(i).getTextContent());

            }else{
                // This is the comment string.
                String commentString = nodes.item(i).getTextContent();
                System.out.println("Comment: "+commentString);
            }
        }
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}



}
person Yogesh Patil    schedule 20.08.2012
comment
Теги plsql , oracle. - person AnBisw; 20.08.2012

Применение слишком большого количества функций к тексту XML может отрицательно сказаться на производительности, поэтому в качестве альтернативы должно работать что-то вроде этого:

SQL> create table my_xml of xmltype;

Table created.

SQL> insert into my_xml values (xmltype('<?xml version="1.0" encoding="utf-8"?> 
                    <!--ADOR Acknowledgement 2-->  
                    <AckTransmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.irs.gov/efile">
                    <TransmissionHeader recordCount="1">  
                    <Jurisdiction>ALABAMA</Jurisdiction>  
                    <TransmissionId>1946157056</TransmissionId>    
                    <Timestamp>2012-08-16T01:25:47-05:00</Timestamp> 
                    <Transmitter>      
                      <ETIN>00000</ETIN>     
                    </Transmitter>  
                    <ProcessType>T</ProcessType>  
                    <AgentIdentifier>ACK</AgentIdentifier> 
                    </TransmissionHeader> 
                    <Acknowledgement> 
                      <SubmissionId>X1684956672</SubmissionId> 
                      <EFIN>X16849</EFIN>  
                      <GovernmentCode>ALST</GovernmentCode> 
                      <SubmissionType>XMLTOM</SubmissionType>
                      <TaxYear>9999</TaxYear>  
                      <SubmissionCategory>MFET</SubmissionCategory>   
                      <AcceptanceStatus>A</AcceptanceStatus>  
                      <ContainedAlerts>0</ContainedAlerts>    
                      <StatusDate>2012-08-16</StatusDate>   
                    </Acknowledgement> 
                    </AckTransmission>'));

1 row(s) inserted.      

SQL> select x.comment_text
  from my_xml t
       , xmltable(
         '/descendant::comment()'
          passing t.object_value
          columns comment_text varchar2(200) path '.'
        ) x
   ;

COMMENT_TEXT
----------------------------
ADOR Acknowledgement 2
person AnBisw    schedule 20.08.2012