如何正确解析此xml响应

时间:2011-04-08 17:44:53

标签: c# sql xml

我们正在使用货币服务进行货币兑换。 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#中作为文本文件读取。 我理解如何实现这一目标。

3 个答案:

答案 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