【问题标题】:Parsing Non-Standard XML Data from SQL Server从 SQL Server 解析非标准 XML 数据
【发布时间】:2014-01-21 17:05:14
【问题描述】:

作为项目的一部分,我需要从一些似乎不是标准 XML 的 XML 中解析一些值。 XML 存储在 SQL Server 中。我需要查询数据库并检索此 XML,然后在 C# 中我需要获取 XCoord 和 YCoord 字段的值。有人可以告诉我如何使用 System.Xml 来实现吗?

如果有人知道通过 SQL 查询从 XML 数据中返回这些值,那也可以。

<AdapterItem xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.enceladus.com/Data">
  <Attributes>
    <Attribute>
      <Name>Process ID</Name>
      <Value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">1000</Value>
    </Attribute>
    <Attribute>
      <Name>Request</Name>
      <Value i:type="AdapterItem">
        <Attributes>
          <Attribute>
            <Name>Location</Name>
            <Value i:type="AdapterItem">
              <Attributes>
                <Attribute>
                  <Name>XCoord</Name>
                  <Value xmlns:d10p1="http://www.w3.org/2001/XMLSchema" i:type="d10p1:string">482557.53208923</Value>
                </Attribute>
                <Attribute>
                  <Name>YCoord</Name>
                  <Value xmlns:d10p1="http://www.w3.org/2001/XMLSchema" i:type="d10p1:string">240588.72462463</Value>
                </Attribute>
              </Attributes>
            </Value>
          </Attribute>
          <Attribute>
            <Name>Description</Name>
            <Value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">Some Description</Value>
          </Attribute>
        </Attributes>
      </Value>
    </Attribute>
  </Attributes>
</AdapterItem>

提前致谢!

【问题讨论】:

  • “非标准”是指“格式不正确且无法解析”吗?
  • XML 格式良好,但我不熟悉它的布局。您可以说 000.000 但我意识到该值需要其自身的其他属性,例如“类型”。
  • 感谢您的澄清。我认为最好不要说“非标准”,因为它可能具有误导性。但很高兴你得到了答案,无论如何!
  • 当然可以。这是个误会。
  • 不用担心。祝你有美好的一天。

标签: c# sql xml


【解决方案1】:

这里是 C# 解决方案:

var doc = new XmlDocument();

doc.LoadXml(columnValueFromSql);

Console.WriteLine("XCoord={0}, YCoord={1}",
    doc.SelectSingleNode("//Attribute[Name='XCoord']/Value").InnerText,
    doc.SelectSingleNode("//Attribute[Name='YCoord']/Value").InnerText);

/* Outputs:

XCoord=482557.53208923, YCoord=240588.72462463

*/

【讨论】:

  • 谢谢!这很好用。如果我在第 1 行删除我的命名空间,这将有效。
【解决方案2】:

你可以写一些类似的,

  WITH XMLNAMESPACES (http://www.w3.org/2001/XMLSchema' AS d4p1,
                      'http://schemas.enceladus.com/Data' AS message)

SELECT 
      CAST([XML_DATA] AS XML).value('(/AdapterItem/Attributes/Attribute[2]/Value/Attributes/Attribute[1]/Value/Attributes/Attribute[1]/Value)[1]', 'VARCHAR(20)') AS 'XCoord',
      CAST([XML_DATA] AS XML).value('(/AdapterItem/Attributes/Attribute[2]/Value/Attributes/Attribute[1]/Value/Attributes/Attribute[2])[1]', 'VARCHAR(20)') AS 'YCoord' FROM YOURTABLE

【讨论】:

  • 我认为您对 XML 结构的假设可能并不总是正确的。您可能应该匹配属性名称而不是它们的位置。
  • 查看置顶评论。起初看起来不太对,但结构是这样设计的。
【解决方案3】:

SQL Server 查询如下所示:

with xmlnamespaces(default 'http://schemas.enceladus.com/Data')
select T.XMLCol.value('(//Attribute[Name = "XCoord"]/Value/text())[1]', 'varchar(20)') as XCoord,
       T.XMLCol.value('(//Attribute[Name = "YCoord"]/Value/text())[1]', 'varchar(20)') as YCoord
from YourTable as T

【讨论】:

  • 太棒了。这适用于 SQL 端。我会给你一个投票,但没有足够的声誉!谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-12-08
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 2020-04-10
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多