Получить URL-адрес и имя XSL в XML-файле, используя Java - PullRequest
3 голосов
/ 12 июля 2011

У меня есть простой XML-файл, подобный следующему:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="01C3_OIZODEMO_certificato_v1.0.xsl"?>
<Certificato>
    <TD:Global xmlns:TD="http://www.xxxx.org/TD_tags">
        <TD:XSL_Def>
            <TD:orig>http://www.xxxx.com/xsl/</TD:orig>
        </TD:XSL_Def>
    </TD:Global>
    <TipoCert>Stato civile</TipoCert>
    <Nominativo>Fenil Postume</Nominativo>
    <DatiNascita>
        <DataNas>01/01/2099</DataNas>
        <Luogo>Perengana</Luogo>
        <Atto>Atto n. 735 p.1 s.A u. 1</Atto>
    </DatiNascita>
    <Indirizzo>
        <Via>Via Perengana</Via>
        <NumeroCivico>0</NumeroCivico>
        <Cap>99999</Cap>
        <Frazione>NA</Frazione>
    </Indirizzo>
    <Testo>TEST</Testo>
    <Data>22/12/2010</Data>
    <Ora>10:48:00</Ora>
</Certificato>

Как я могу получить имя файла "01C3_OIZODEMO_certificato_v1.0.xsl", используя xml API в Java?

Большое спасибо!!

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Да, попробуйте использовать TransformerFactory.getAssociatedStylesheet метод:

TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xml = new StreamSource("input.xml");
Source xsl = factory.getAssociatedStylesheet(xml, null, null, null);
System.out.println(new File(xsl.getSystemId()).getName());

Возвращает:

01C3_OIZODEMO_certificato_v1.0.xsl

Другие способы:

SAX API:

SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
saxParser.parse("input.xml", new DefaultHandler()
{
    @Override
    public void processingInstruction(String target, String data)
        throws SAXException
    {
        if (target.equals("xml-stylesheet"))
        {
            Pattern pattern = Pattern.compile("href=\"(.+)\"");
            Matcher matcher = pattern.matcher(data);
            if (matcher.find())
                System.out.println(matcher.group(1));
        }
    }
});  

DOM API:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("input.xml");

XPathFactory pathFactory = XPathFactory.newInstance();
XPath path = pathFactory.newXPath();
XPathExpression expression = 
    path.compile("//processing-instruction('xml-stylesheet')");
ProcessingInstruction instruction =
    (ProcessingInstruction) expression.evaluate(doc, XPathConstants.NODE);

Pattern pattern = Pattern.compile("href=\"(.+)\"");
Matcher matcher = pattern.matcher(instruction.getData());
if (matcher.find())
    System.out.println(matcher.group(1));

В обоих случаях результат одинаков:

01C3_OIZODEMO_certificato_v1.0.xsl
0 голосов
/ 12 июля 2011

используйте регулярное выражение <\?xml-stylesheet type="text/xsl" href="(.*?)"\?>

...