【发布时间】:2013-12-04 08:58:08
【问题描述】:
我正在尝试从 Magyar Nemzeti 银行下载和转换肥皂响应。我设法得到了下载部分,现在我遇到了 xslt 转换的问题。我想将消息转换为 xml,以便可以反序列化它。
SOAP 响应:
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetCurrentExchangeRatesResponse xmlns="http://www.mnb.hu/webservices/">
<GetCurrentExchangeRatesResult>
<MNBCurrentExchangeRates>
<Day date="2013-12-03">
<Rate curr="AUD" unit="1">203,5</Rate>
<Rate curr="BGN" unit="1">154,82</Rate>
<Rate curr="BRL" unit="1">94,69</Rate>
<Rate curr="CAD" unit="1">209,79</Rate>
<Rate curr="CHF" unit="1">246,21</Rate>
<Rate curr="CNY" unit="1">36,62</Rate>
<Rate curr="CZK" unit="1">11,02</Rate>
<Rate curr="DKK" unit="1">40,59</Rate>
<Rate curr="EUR" unit="1">302,8</Rate>
<Rate curr="GBP" unit="1">366,05</Rate>
<Rate curr="HKD" unit="1">28,78</Rate>
<Rate curr="HRK" unit="1">39,67</Rate>
<Rate curr="IDR" unit="100">1,88</Rate>
<Rate curr="ILS" unit="1">63,32</Rate>
<Rate curr="INR" unit="1">3,58</Rate>
<Rate curr="ISK" unit="1">1,87</Rate>
<Rate curr="JPY" unit="100">217,08</Rate>
<Rate curr="KRW" unit="100">21,04</Rate>
<Rate curr="LTL" unit="1">87,71</Rate>
<Rate curr="LVL" unit="1">430,68</Rate>
<Rate curr="MXN" unit="1">16,89</Rate>
<Rate curr="MYR" unit="1">69,33</Rate>
<Rate curr="NOK" unit="1">36,46</Rate>
<Rate curr="NZD" unit="1">183,65</Rate>
<Rate curr="PHP" unit="1">5,1</Rate>
<Rate curr="PLN" unit="1">72,03</Rate>
<Rate curr="RON" unit="1">67,89</Rate>
<Rate curr="RSD" unit="1">2,65</Rate>
<Rate curr="RUB" unit="1">6,71</Rate>
<Rate curr="SEK" unit="1">34,08</Rate>
<Rate curr="SGD" unit="1">177,85</Rate>
<Rate curr="THB" unit="1">6,93</Rate>
<Rate curr="TRY" unit="1">109,6</Rate>
<Rate curr="UAH" unit="1">27,14</Rate>
<Rate curr="USD" unit="1">223,09</Rate>
<Rate curr="ZAR" unit="1">21,59</Rate>
</Day>
</MNBCurrentExchangeRates>
</GetCurrentExchangeRatesResult>
</GetCurrentExchangeRatesResponse>
</soap:Body>
</soap:Envelope>
我的 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ws="http://www.mnb.hu/webservices/">
<xsl:output method="xml" version="1.0" encoding="UTF-8" />
<xsl:template match="/">
<xsl:element name="list">
<xsl:value-of select="soap:Envelope/soap:Body/ws:GetCurrentExchangeRatesResponse/ws:GetCurrentExchangeRatesResult" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这个 XSLT 像预期的那样工作,但我不能比这更深入。每次我尝试访问 MNBCurrentExchangeRates 元素时,选择结果都是空的。 (我尝试了 ws:MNBCurrentExchangeRates、*[local-name()='MNBCurrentExchangeRates'] 和许多其他不太现实的选项)
如果有帮助,此soap 请求的规范说明GetCurrentExchangeRatesResult 元素的内容是字符串:
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetCurrentExchangeRatesResponse xmlns="http://www.mnb.hu/webservices/">
<GetCurrentExchangeRatesResult>string</GetCurrentExchangeRatesResult>
</GetCurrentExchangeRatesResponse>
</soap:Body>
</soap:Envelope>
有没有办法获取 Day 和 Rate 元素并选择它们?
谢谢, 知乎
编辑: 我尝试了 user3016153 和 Mathias Müller 的答案,但没有一个对我有用,所以让我换个问题:
为什么要使用 XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ws="http://www.mnb.hu/webservices/">
<xsl:output method="xml" version="1.0" encoding="UTF-8" />
<xsl:template match="/">
<xsl:element name="list">
<xsl:value-of select="//ws:GetCurrentExchangeRatesResult" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
正在工作,这是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ws="http://www.mnb.hu/webservices/">
<xsl:output method="xml" version="1.0" encoding="UTF-8" />
<xsl:template match="/">
<xsl:element name="list">
<xsl:value-of select="//ws:MNBCurrentExchangeRates" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
不是吗?
Mathias Müller 的回答创建了这个结果(xml 编码被破坏并且日期访问不起作用):
<?xml version="1.0" encoding="utf-16"?><MNBCurrentExchangeRates><Day date="2013-12-03"><Rate curr="AUD" unit="1">203,5</Rate><Rate curr="BGN" unit="1">154,82</Rate><Rate curr="BRL" unit="1">94,69</Rate><Rate curr="CAD" unit="1">209,79</Rate><Rate curr="CHF" unit="1">246,21</Rate><Rate curr="CNY" unit="1">36,62</Rate><Rate curr="CZK" unit="1">11,02</Rate><Rate curr="DKK" unit="1">40,59</Rate><Rate curr="EUR" unit="1">302,8</Rate><Rate curr="GBP" unit="1">366,05</Rate><Rate curr="HKD" unit="1">28,78</Rate><Rate curr="HRK" unit="1">39,67</Rate><Rate curr="IDR" unit="100">1,88</Rate><Rate curr="ILS" unit="1">63,32</Rate><Rate curr="INR" unit="1">3,58</Rate><Rate curr="ISK" unit="1">1,87</Rate><Rate curr="JPY" unit="100">217,08</Rate><Rate curr="KRW" unit="100">21,04</Rate><Rate curr="LTL" unit="1">87,71</Rate><Rate curr="LVL" unit="1">430,68</Rate><Rate curr="MXN" unit="1">16,89</Rate><Rate curr="MYR" unit="1">69,33</Rate><Rate curr="NOK" unit="1">36,46</Rate><Rate curr="NZD" unit="1">183,65</Rate><Rate curr="PHP" unit="1">5,1</Rate><Rate curr="PLN" unit="1">72,03</Rate><Rate curr="RON" unit="1">67,89</Rate><Rate curr="RSD" unit="1">2,65</Rate><Rate curr="RUB" unit="1">6,71</Rate><Rate curr="SEK" unit="1">34,08</Rate><Rate curr="SGD" unit="1">177,85</Rate><Rate curr="THB" unit="1">6,93</Rate><Rate curr="TRY" unit="1">109,6</Rate><Rate curr="UAH" unit="1">27,14</Rate><Rate curr="USD" unit="1">223,09</Rate><Rate curr="ZAR" unit="1">21,59</Rate></Day></MNBCurrentExchangeRates>
我正在粘贴 .NET 代码来完成问题:
XslCompiledTransform xslt = new XslCompiledTransform();
using (StringWriter writer = new StringWriter())
{
xslt.Load(xsltPath);
xslt.Transform(xmlDoc.CreateNavigator(), null, writer);
string xml = writer.ToString();
XmlSerializer serializer = new XmlSerializer(typeof(List));
using (TextReader reader = new StringReader(xml))
{
return (List)serializer.Deserialize(reader);
}
}
【问题讨论】:
-
在我看来,您以某种方式将 XML 读取为文本,而不是将其解析为 XML。你能解释一下你的最终预期结果是什么吗?也许这一切都可以在 XSLT 中完成。
-
我想将5个不同的XML处理成同一个模板,反序列化成.NET对象,然后保存到数据库中。