2014-01-21 4 views
1

В качестве части проекта мне нужно проанализировать некоторые значения из некоторого XML, который, как представляется, не является стандартным XML. XML хранится в SQL Server. Мне нужно запросить базу данных и получить этот XML, а затем в C# мне нужно получить значение полей XCoord и YCoord. Может ли кто-нибудь показать мне, как это можно достичь с помощью System.Xml?Анализ нестандартных XML-данных с SQL Server

Если кто-либо знает SQL Query, чтобы вернуть эти значения из данных 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> 

Заранее спасибо!

+2

К "нестандартным" , вы имеете в виду «плохо сформированный и не разбирающийся»? –

+0

XML хорошо сформирован, но я не был знаком с его компоновкой. Вы могли бы сказать <Атрибут name = "XCoord"> 000.000, но я понимаю, что для этого значения требуются дополнительные собственные атрибуты, такие как «тип». – Enceladus

+0

Спасибо за разъяснение. Я думаю, было бы/было бы лучше не говорить «нестандартно», потому что это потенциально обманчиво. Но рад, что вы получили ответ, во всяком случае! –

ответ

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 

*/ 
+0

Спасибо! Это отлично работает. Это работает, если я удалю свое пространство имен в строке 1. – Enceladus

0

Вы могли бы написать несколько подобных этому,

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 
+0

Я думаю, что вы предполагаете что-то о структуре XML, которая не всегда может быть правдой. Вероятно, вам следует сопоставлять имена атрибутов, а не их позиции. – JLRishe

+0

См. Главный комментарий. Сначала это выглядело не так, но структура была разработана именно так. – Enceladus

0

SQL-запрос сервера будет выглядеть следующим образом:

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 
+0

Удивительный. Это работает на стороне SQL. Я бы дал вам голосование, но не получил достаточной репутации! Благодарю. – Enceladus

Смежные вопросы