在 c# 中解析动态创建的 XML 文档
本文关键字:创建 XML 文档 动态 | 更新日期: 2023-09-27 18:31:06
我必须像这样解析一个XML文档:
<?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 文档并形成连接字符串,并执行在 <Query>
节点中指定的查询/存储过程。我形成连接字符串没有问题。由于它可以是任何存储过程,并且可以具有任意数量的parameters
,因此我无法找到解析此XML的方法。XML将是动态的 - 参数,参数名称,参数类型等,它不受我的控制。到目前为止,我有这段代码,如果只有 1 个参数(我假设它将是"int"),它就可以工作):
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();
}
然后,我形成连接字符串并执行存储过程。当它是动态的时,我该如何处理它?
我无法弄清楚 dialDataSrc 的类型,但这应该会让你上路:
var listOfparameters = DialsDoc
.Element("Parameters")
.Elements()
.Select(p => MyCreateParam((string) p.Element("Name"), (string) p.Element("Type")))
.ToList();
用一些辅助方法来找出数据库类型等:
private SqlParameter MyCreateParam(string name, string _type) { ... }