【问题标题】:Pulling XML data from SQL Server to be parsed into JSON formatting problems in C#从 SQL Server 提取 XML 数据以解析为 C# 中的 JSON 格式问题
【发布时间】:2012-06-07 16:27:49
【问题描述】:

我在 C# 中使用 SQLCommand 对将输出 XML 的本地计算机运行 SQL。 SQL 代码如下所示:

"SELECT 
   ' '                          AS 'ItemsCount', 
   ' '                          AS 'Shipping', 
   ' '                          AS 'Fee', 
   ' '                          AS 'ShippingPrc', 
   ' '                          AS 'FeeType', 
   ' '                          AS 'FeeTaxPrc', 
 //many lines of SQL omitted
 FROM   im_item 
   JOIN ps_doc_lin 
     ON im_item.item_no = ps_doc_lin.item_no 
   JOIN  ps_doc_hdr 
     ON ps_doc_hdr.doc_id = ps_doc_lin.doc_id 
   JOIN ar_cust 
   ON ar_cust.cust_no = ps_doc_hdr.cust_no 
 WHERE  ps_doc_hdr.tkt_dt = (SELECT Max(tkt_dt) //I select Max(tkt_dt) here because this program will run right after a customer has completed checkout.  I want to get the most recent ticket (i.e. the ticket just rang up)
                        FROM   ps_doc_hdr) 
 FOR xml path ('Receipt')";

这一直有效,但我最近发现了一个致命缺陷。如果在数据库中客户购买了多件商品,则 SQL Server 的 XML 输出将是一个 XML 文件,其中包含针对所购买的每件商品重复的该客户的信息。如果我在 C# 中解析 XML 输出,则无法完成,输出会产生多个根元素。我怀疑是各种表的 JOIN 导致了这种情况,但我必须从 SQL 中提取各种数据,我需要这些连接才能得到我需要的东西。

我尝试做类似的事情:

   ' '                          AS 'Total', 
   ' '                          AS 'InvcHdrRcptStatus', 
   ' '                          AS 'InvcHdrRcptType', 
   ' '                          AS 'Cashier', 
   ' '                          AS 'DocDate', 
   ' '                          AS 'InvcNum', 
   (SELECT      ps_doc_lin.sls_rep           AS 'Clerk'
                    FROM PS_DOC_LIN
                    WHERE PS_DOC_LIN.DOC_ID = PS_DOC_HDR.DOC_ID
                    FOR XML PATH ('Item')) as Items, 
   (SELECT     ar_cust.cust_no              AS 'BillToCustNumber', 
   ' '                          AS 'BillToCustCompany', 
   ar_cust.fst_nam              AS 'BillToFName', 
   ar_cust.lst_nam              AS 'BillToLName', 
   ar_cust.salutation           AS 'Customer/Name/Title', 
   ar_cust.adrs_1               AS 'BillToAddr1', 
   ar_cust.adrs_2               AS 'BillToAddr2', 
   ' '                          AS 'BillToAddr3', 
   ar_cust.zip_cod              AS 'BillToZip', 
   ' '                          AS 'BillToInfo1', 
   ' '                          AS 'BillToInfo2', 
   ' '                          AS 'BillToPhone1', 
   ' '                          AS 'BillToPhone2', 
   ar_cust.phone_1              AS 'ShipToPhone1', 
   ar_cust.phone_2              AS 'ShipToPhone2' FROM AR_CUST WHERE AR_CUST.CUST_NO = PS_DOC_HDR.CUST_NO FOR XML PATH ('Customer'), TYPE) as Customers,

我将 JOIN 嵌套到另一个选择中。虽然这确实有效,但在转换为 JSON 时格式不正确。输出如下所示:

{"Receipt":{ ......//omitted data
 ,"Customer":{"Name: {"title":"Mr."}}

我的预期输出将所有数据组织在 {"Receipt": 内,而不使用另一个 {。类似这样:

    "Receipt" : {
    "InvcHdrNotes" : ""
    "Tax" : ""
    "TaxPrc" : ""
    "DiscPrc" : ""
    "Discount" : ""
    "InvcComment1" : ""
    "InvcComment2" : ""
}

“收据”是一个更大的 JSON 文件的一个小节。但是,对于我需要获取的其余数据,这个缺陷将被复制(我假设是这样),因为我也需要 JOIN 来获取这些数据。我试过同时使用 Jayrock 和 Newtonsoft.Json,但都有这个问题。

我的目标 XML 输出将是:

<Receipt>
<InvcHdrNotes> </InvcHdrNotes>
<Tax>Y</Tax>
<Clerk>MGR</Clerk>
<BillToCustNumber>1000</BillToCustNumber>
<BillToCustCompany> </BillToCustCompany>
<BillToFName>Bill</BillToFName>
<BillToLName>Baker</BillToLName>
<Customer>
  <Name>
    <Title>Mr.</Title>
  </Name>
</Customer>
<BillToAddr1>1426 Millstream Parkway</BillToAddr1>
<BillToAddr3> </BillToAddr3>
<BillToZip>38120</BillToZip>
<BillToInfo1> </BillToInfo1>
<BillToInfo2> </BillToInfo2>
<ShipToCustNumber>1000</ShipToCustNumber>
<ShipToCustCompany> </ShipToCustCompany>
<ShipToFName>Bill</ShipToFName>
<ShipToLName>Baker</ShipToLName>
<ShipToTitle>Mr.</ShipToTitle>
<ShipToAddr1>1426 Millstream Parkway</ShipToAddr1>
<ShipToZip>38120</ShipToZip>
</Receipt>

我使用上面的 SQL 代码得到这个输出,但是在引发我提到的异常之后重复相同的信息。

这是否可能,或者这是一个致命的设计缺陷?如果不可能,我不确定如何完成这项任务。谢谢。

【问题讨论】:

  • 只是一个建议:您似乎在询问 XML 到 JSON 的转换。这与SQL无关!删除 SQL 并添加将 XML 转换为 JSON 的代码怎么样?
  • 这确实与 SQL 有关。重新阅读我的问题,我正在使用 Jayrock 和 Newtonsoft.Json 来序列化它们都是众所周知且可用的。问题与 XML -> JSON 没有太大关系,它来自 SQL 代码的 XML 输出具有多个根元素,因此在加载 doc.LoadXML(xml) 时会引发 XmlException。更不用说格式不正确的 XML 意味着格式不正确的 JSON,GIGO。
  • 如果问题出在 SQL Server 生成的 XML 中。发布您希望查询返回的内容,并删除 JSON 内容。您甚至可以在 sqlfiddle.com 上设置一个示例
  • 如果您有多个根元素,为什么不使用基本的字符串操作和文件 IO 例程将它们包装在一个根元素中?
  • 我已经添加了我希望查询返回的预期 XML。该查询当前将返回该 XML,但重复次数与客户购买的商品数量相同,从而在使用 XMLDocument 类处理时引发“多个根元素”异常。

标签: c# sql xml json


【解决方案1】:

看起来您正在序列化返回到相同 XML 的每一行 - 所以您最终会得到多个根元素。您需要序列化 ​​List 本身。

所以你最终会得到:

<Receipts>
  <Receipt>
    ...
  </Receipt>
  <Receipt>
    ...
  </Receipt>
</Receipts>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    相关资源
    最近更新 更多