我们正在使用货币服务进行货币兑换。 xml Web响应的格式不是最好的。它看起来像这样
<RESPONSE>
<EXPR>USD</EXPR>
<EXCH>CAD</EXCH>
<AMOUNT>1</AMOUNT>
<NPRICES>1</NPRICES>
<CONVERSION>
<DATE>Thu, 07 Apr 2011 21:00:00 GMT</DATE>
<ASK>1.0418</ASK>
<BID>1.0415</BID>
</CONVERSION>
<EXPR>USD</EXPR>
<EXCH>AUD</EXCH>
<AMOUNT>1</AMOUNT>
<NPRICES>1</NPRICES>
<CONVERSION>
<DATE>Thu, 07 Apr 2011 21:00:00 GMT</DATE>
<ASK>1.0461</ASK>
<BID>1.0459</BID>
</CONVERSION>
</RESPONSE>
所以我尝试编写以下SQL语句
SELECT
T.c.value('../EXPR[1]', 'VARCHAR(3)')
, T.c.value('../EXCH[1]', 'VARCHAR(3)')
, T.c.value('ASK[1]', 'MONEY')
FROM @xml.nodes('/RESPONSE/CONVERSION') T(c)
但由于Headers(EXPR和EXCH)都在同一级别,无论如何我都可以选择转换之上的Expr。 无需在C#中作为文本文件读取。 我理解如何实现这一目标。
答案 0 :(得分:1)
如果您的节点始终处于相同的顺序,则可以在开始解析之前尝试以下操作:
1)删除,标签:例如xmlString = xmlString.Replace(“”,string.empty)...
2)拆分你的字符串:entries [] = xmlString.Split(“”);或使用Regex.Split
3)向所有条目添加缺失标签:,,
4)解析条目
答案 1 :(得分:1)
如果您这样做:
using System.Xml;
public class TestClass
{
void ParseXML(string xml)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
XmlNodeList list = doc.GetElementsByTagName("EXPR");
}
}
在该示例中,list[0]
应包含EXPR标记的第一个实例。
答案 2 :(得分:1)
这里的想法是按文档顺序选择所有EXPR,EXCH和ASK节点,并在指定的行号上加入它们:
select
exprn.val
, exchn.val
, askn.val
FROM
(select expr.e.value('.', 'VARCHAR(3)') as val, row_number() over(order by expr.e) n from @xml.nodes('/RESPONSE/EXPR') expr(e)) exprn
join (select exch.e.value('.', 'VARCHAR(3)') as val, row_number() over(order by exch.e) n from @xml.nodes('/RESPONSE/EXCH') exch(e)) exchn on exchn.n = exprn.n
join (select ask.a.value('.', 'MONEY') as val, row_number() over(order by ask.a) n from @xml.nodes('/RESPONSE/CONVERSION/ASK') ask(a)) askn on askn.n = exprn.n