【问题标题】:How to properly parse this xml response如何正确解析此 xml 响应
【发布时间】:2011-04-08 17:44:52
【问题描述】:

我们正在使用货币兑换服务。 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)

但是由于两个标头(EXPR 和 EXCH)都在同一级别,所以无论如何我可以选择转换上方的 Expr。 并且无需在 C# 中读取为文本文件。 我明白我将如何做到这一点。

【问题讨论】:

  • 哇!任何想出这种回复格式的人都应该被送回学校。
  • 您是否也尝试在 SQL 中完成这一切?
  • 您在寻找 SQL 或 C# 的答案吗?如果您不是在寻找 C# 答案,则可能需要删除该标签。
  • @Bala R - 同意 - 那些日期表示是残酷的。它们是特定于文化的 - 绝不是一个好主意。
  • 我可以在 C# 或 Sql 中执行此操作,因为无论如何我都是在 c# 程序中进行网络调用。同样,我有一个文本阅读器解决方案,但不知道它是否是最好的。我也在考虑使用@xml.modify 来尝试插入所需的级别。

标签: c# sql xml


【解决方案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

【讨论】:

    【解决方案2】:

    如果你的节点总是在相同的顺序,你可以在开始解析之前尝试以下操作:

    1) 删除 , 标签:例如xmlString = xmlString.Replace("", string.empty) ...

    2) 拆分你的字符串:entry[] = xmlString.Split("");或使用 Regex.Split

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

    4) 解析条目

    【讨论】:

      【解决方案3】:

      如果你这样做:

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

      【讨论】:

      • 这就是我们在工作中的做法。然后我们使用 BULK sql 命令将其复制到 db。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多