2011-04-08 125 views
1

我们正在使用货币服务进行货币兑换。有XML网站响应不是最大的格式。它看起来像这样如何正确解析此xml响应

<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) 

但是因为两个头(EXPR和交换)处于同一水平,是有反正我可以选择后面的Expr高于转换。 而不读取为C#中的文本文件。 我明白我将如何实现这一目标。

+5

哇!提出这种回复格式的人应该被送回学校。 – 2011-04-08 17:47:41

+0

你是否试图在SQL中完成这一切? – Tejs 2011-04-08 17:49:35

+1

您是否正在寻找SQL或C#中的答案?如果您不想查找C#答案,则可能需要删除该标签。 – Mykroft 2011-04-08 17:50:35

回答

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 
+0

这是一个很好的建议 – Mike 2011-04-08 18:53:11

1

如果节点总是以相同的顺序,你可以尝试以下才开始解析是:

1)拆下,标签:例如xmlString = xmlString.Replace(“”,string.empty)...

2)Split your string:entries [] = xmlString.Split(“”);或使用Regex.Split

3)添加缺少的标签的所有条目:,,

4)分析条目

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标签的第一个实例。

+0

这就是我们在工作中的做法。然后我们使用BULK sql命令将它复制到db。 – clamchoda 2011-04-08 18:32:18