如何将String xml转换为XML节点XSLT

时间:2016-12-15 18:34:24

标签: xml xslt xpath

我正在使用Banxico Web Services并返回一个字符串,在该字符串中有XML。

我真正需要的是使用XSLT或XPath提取下一部分。

如何使用XSLT或Xpath?

  

  PesospordólarE.U.A。 Tipo de cambio para solventar obligaciones   denominadas en moneda extranjera Fecha dedeterminación(FIX)“   IDSERIE =“SF43718”BANXICO_FREQ =“Dia”BANXICO_FIGURE_TYPE =“TipoCambio”   BANXICO_UNIT_TYPE = “PesoxDoll” >                          

 public class OAuth2ServerConfiguration extends ResourceServerConfigurerAdapter {

        @Override
        public void configure(ResourceServerSecurityConfigurer resources) {

            // ...set up token store here

            resources.authenticationEntryPoint(new AuthenticationEntryPoint() {
                @Override
                public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {

                 //QUESTION
                 // How do I get the destination controller that this request was going to go to?
                 // Really, I'd like to get some information about the annotations that were on the destination controller.

                    response.setStatus(401);
                }
            });
        }

通过该响应,我构建了一个xsd模式。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header>
      <X-OPNET-Transaction-Trace:X-OPNET-Transaction-Trace soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xsi:type="soapenc:string" xmlns:X-OPNET-Transaction-Trace="http://opnet.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">pid=4468,requestid=4d0ce60a-c92f-441e-87b1-4c6f12b26574</X-OPNET-Transaction-Trace:X-OPNET-Transaction-Trace>
   </soapenv:Header>
   <soapenv:Body>
      <ns1:tiposDeCambioBanxicoResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ws.dgie.banxico.org.mx">
         <result xsi:type="xsd:string"><![CDATA[<?xml version="1.0" encoding="ISO-8859-1"?>
<CompactData xmlns="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/message"
xmlns:bm="http://www.banxico.org.mx/structure/key_families/dgie/sie/series/compact"
xmlns:compact="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/compact"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/message SDMXMessage.xsd
http://www.banxico.org.mx/structure/key_families/dgie/sie/series/compact BANXICO_DGIE_SIE_Compact.xsd
http://www.SDMX.org/resources/SDMXML/schemas/v1_0/compact SDMXCompactData.xsd" >
    <Header>
        <ID>TIPOSDECAMBIO</ID>
        <Test>false</Test>
        <Truncated>false</Truncated>
        <Name xml:lang="sp">Tipos de Cambio</Name>
        <Prepared>2016-12-15 12:26:37.766</Prepared>
        <Sender id="BANXICO">
            <Name xml:lang="sp">Banco de México</Name>
            <Contact>
            <Name xml:lang="sp">Subgerencia de Desarrollo de Sistemas</Name>
            <Telephone>(01 55)52372678</Telephone>
            </Contact>
        </Sender>
        <DataSetAction>Update</DataSetAction>
        <Extracted>2016-12-15 12:26:37.766</Extracted>
    </Header>
    <bm:DataSet>
        <bm:SiblingGroup BANXICO_FREQ="Dia" TIME_FORMAT="P1D"/>
        <bm:Series TITULO="Tipo de cambio pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de liquidación" IDSERIE="SF60653" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="PesoxDoll">
            <bm:Obs TIME_PERIOD="2016-12-15" OBS_VALUE="20.2567"/>
        </bm:Series>
        <bm:Series TITULO="Tipo de cambio                                          Pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de determinación (FIX)" IDSERIE="SF43718" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="PesoxDoll">
            <bm:Obs TIME_PERIOD="2016-12-15" OBS_VALUE="20.5973"/>
        </bm:Series>
        <bm:Series TITULO="Cotización de las divisas que conforman la canasta del DEG Respecto al peso mexicano Euro" IDSERIE="SF46410" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="Peso">
            <bm:Obs TIME_PERIOD="2016-12-14" OBS_VALUE="21.535"/>
        </bm:Series>
        <bm:Series TITULO="Cotización de la divisa Respecto al peso mexicano Dólar Canadiense" IDSERIE="SF60632" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="Peso">
            <bm:Obs TIME_PERIOD="2016-12-14" OBS_VALUE="15.4178"/>
        </bm:Series>
        <bm:Series TITULO="Cotización de las divisas que conforman la canasta del DEG Respecto al peso mexicano Yen japonés" IDSERIE="SF46406" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="Peso">
            <bm:Obs TIME_PERIOD="2016-12-14" OBS_VALUE="0.176"/>
        </bm:Series>
        <bm:Series TITULO="Cotización de las divisas que conforman la canasta del DEG Respecto al peso mexicano Libra esterlina" IDSERIE="SF46407" BANXICO_FREQ="Dia" BANXICO_FIGURE_TYPE="TipoCambio" BANXICO_UNIT_TYPE="Peso">
            <bm:Obs TIME_PERIOD="2016-12-14" OBS_VALUE="25.5806"/>
        </bm:Series>
    </bm:DataSet>
</CompactData>]]></result>
      </ns1:tiposDeCambioBanxicoResponse>
   </soapenv:Body>
</soapenv:Envelope>

2 个答案:

答案 0 :(得分:3)

要运行XSL转换以提取所需信息,您不需要生成架构。

如果你可以使用XPath 3函数,你可以一次完成所有这些:XPath 3包含一个解析字符串并将其转换为逻辑XML树的函数,然后允许你对它运行XPath表达式。 / p>

如果您不能使用XPath 3函数,那么您需要在两次传递中执行此操作:仅导出<result>文本内容(您希望进一步处理的XML响应)到一个单独的文件,然后加载该文件并在其上运行另一个转换以提取您想要的内容。

以下是使用XPath 3在一次传递中处理此问题的快速而肮脏的示例。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="3.0">

    <!-- Start at the document node / and set up the outermost element -->
    <xsl:template match="/">
        <!-- Change this element name to whatever makes sense for you -->
        <BanxicoReply>
            <!-- The input file only has one "result", 
                and that's all we want, so grab it -->
            <xsl:apply-templates select="//result"/>
        </BanxicoReply>
    </xsl:template>

    <xsl:template match="result">
        <!-- Parse the CDATA content to turn it into XML -->
        <xsl:variable name="contained-xml" select="parse-xml(./text())"/>

        <!-- Do what you need to here.
            This example just plucks out the one chunk
            you identified at the top of your post. 

            Note the "*:Series" shorthand: this matches
            any "Series" element in any namespace.  This 
            is an admittedly sloppy shortcut, which could
            be dangerous in other contexts - but here, in
            this one file, it's safe, and this avoids the 
            need for us to explicitly declare the "bm:" 
            namespace prefix in this XSL. -->
        <xsl:copy-of select="$contained-xml//*:Series[@IDSERIE='SF43718']"/>
    </xsl:template>

    <!-- Suppress output of all other elements -->
    <xsl:template match="*"/>

</xsl:stylesheet>

使用上面的XML作为输入,此XSL产生以下结果(缩进以便于人类易读性):

<?xml version="1.0" encoding="UTF-8"?>
<BanxicoReply>
    <bm:Series xmlns="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/message" 
        xmlns:bm="http://www.banxico.org.mx/structure/key_families/dgie/sie/series/compact" 
        xmlns:compact="http://www.SDMX.org/resources/SDMXML/schemas/v1_0/compact" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        TITULO="Tipo de cambio                                          Pesos por dólar E.U.A. Tipo de cambio para solventar obligaciones denominadas en moneda extranjera Fecha de determinación (FIX)" 
        IDSERIE="SF43718" 
        BANXICO_FREQ="Dia" 
        BANXICO_FIGURE_TYPE="TipoCambio" 
        BANXICO_UNIT_TYPE="PesoxDoll">
        <bm:Obs TIME_PERIOD="2016-12-15" OBS_VALUE="20.5973"/>
    </bm:Series>
</BanxicoReply>

答案 1 :(得分:0)

我建议使用JSON API https://www.banxico.org.mx/SieAPIRest而不是旧的soap服务。