C# 从SQL Server解析非标准XML数据

C# 从SQL Server解析非标准XML数据,c#,sql,xml,C#,Sql,Xml,作为项目的一部分,我需要从一些似乎不是标准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.e

作为项目的一部分,我需要从一些似乎不是标准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>

提前谢谢

你可以写一些类似的东西

  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

SQL Server查询如下所示:

使用xmlnamespacesdefault'http://schemas.enceladus.com/Data' 选择T.XMLCol.value'//Attribute[Name=XCoord]/value/text[1],'varchar20'作为XCoord, T.XMLCol.value'//Attribute[Name=YCoord]/value/text[1],'varchar20'作为YCoord 从你的桌子上 以下是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

*/

你说的非标准是指格式不好且无法解析吗?XML格式良好,但我不熟悉它的布局。您可以说000.000,但我意识到该值需要其自身的附加属性,例如“type”。感谢您的澄清。我认为最好不要说不标准,因为这可能会产生误导。但无论如何,很高兴你得到了答案!当然可以这是个误会,不用担心。祝您愉快。我想您是在假设XML结构的某些情况,但这些情况可能并不总是正确的。您可能应该匹配属性名称,而不是它们的位置。请参阅顶部注释。一开始看起来不太对,但结构就是这样设计的。谢谢!这很有效。如果我删除第1.1行中的名称空间,这会起作用。这在SQL端起作用。我会投你一票,但没有足够的声誉!谢谢