我正在使用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>
答案 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服务。