2013-09-13 2 views
0

я должен разобрать документ XML, как это:Анализировать динамически созданный XML-документ в C#

<?xml version="1.0" encoding="utf-8" ?> 
    <DialsList> 
     <Dial> 
     <Id>123</Id> 
     <Source>SQL</Source> 
     <Server>myServer</Server> 
     <Database>myDB</Database> 
     <UserName>myUserName</UserName> 
     <Password>myPassword</Password> 
     <TableName>myTable</TableName> 
     <Query>GetAvgForUser</Query> 
     <Parameters> 
      <Param1> 
      <Name>@DialId</Name> 
      <Type>Int</Type> 
      </Param1> 
      <Param2> 
      <Name>@UserId</Name> 
      <Type>String</Type> 
      </Param2> 
     </Parameters> 
     </Dial> 
     <Dial> 
    <Id>789</Id> 
    <Source>SQL</Source> 
    <Server>someServer</Server> 
    <Database>someDB</Database> 
    <UserName>someUser</UserName> 
    <Password>somePwd</Password> 
    <TableName>someTbl</TableName> 
    <Query>someQry</Query> 
    <Parameters> 
     <Param1> 
     <Name>@myParam</Name> 
     <Type>Int</Type> 
     </Param1> 
     <Param2> 
     <Name>@anotherParam</Name> 
     <Type>String</Type> 
     </Param2> 
    </Parameters> 
    </Dial> 
    </DialsList> 

Мое приложение, чтобы прочитать это XML-документ и сформировать строку подключения, а также выполнить запрос/StoredProcedure, указанный в узел <Query>. У меня нет проблем с формированием соединительной строки. Поскольку это может быть любая хранимая процедура, и она может иметь любое число parameters, я не могу понять способ разобрать этот XML. XML будет динамическим - параметры, имена параметров, тип параметра и т. Д. и это не под моим контролем. У меня есть этот код до сих пор, который работает, если есть (я предполагаю, что это будет «ИНТ») только один параметр:

XDocument doc = XDocument.Load(xmlFileName); 
    string dialID = Convert.ToString(DialId); 
    XElement DialsDoc = (from xml2 in doc.Descendants("Dial")      where xml2.Element("Id").Value == dialID            select xml2).FirstOrDefault(); 
    dialDataSrc.Source = DialsDoc.Element("Source").Value.ToString(); 
    if (dialDataSrc.Source.ToString() == "SQL") 
    { 
     DataSource dialDataSrc = new DataSource(); 
     dialDataSrc.MethodNameIndividual = string.Empty; 
     dialDataSrc.MethodNameGroup = string.Empty; 
     dialDataSrc.Server = DialsDoc.Element("Server").Value.ToString(); 
     dialDataSrc.Database = DialsDoc.Element("Database").Value.ToString(); 
     dialDataSrc.Username = DialsDoc.Element("UserName").Value.ToString(); 
     dialDataSrc.Password = DialsDoc.Element("Password").Value.ToString(); 
     dialDataSrc.TableName = DialsDoc.Element("TableName").Value.ToString(); 
     dialDataSrc.Query = DialsDoc.Element("Query").Value.ToString(); 
     dialDataSrc.Parameters = DialsDoc.Element("Parameters").Value.ToString(); 
    } 

Я тогда сформировать строку подключения и выполнить хранимую процедуру. Как я могу справиться с этим, когда он динамичен?

ответ

2

Я не могу понять тип dialDataSrc, но это должно получить вас на вашем пути:

var listOfparameters = DialsDoc 
     .Element("Parameters") 
     .Elements() 
     .Select(p => MyCreateParam((string) p.Element("Name"), (string) p.Element("Type"))) 
     .ToList(); 

С небольшим вспомогательным методом, чтобы выяснить DbType и т.д.:

private SqlParameter MyCreateParam(string name, string _type) { ... } 
+0

Спасибо, Я добавил вспомогательный метод. Однако теперь я получаю сообщение об ошибке: «System.Data.SqlClient.SqlParameter не содержит определения для« ToList »и никакого метода расширения« ToList », принимающего первый аргумент типа ... ... "в .ToList()" – user1550951

+0

Вы проверяли элемент и элементы? Аргумент ToList должен быть IEnumerable. –

+0

По-видимому, в «Select» отсутствует символ «)» в конце. – user1550951

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