C# 从数据库解析xml

C# 从数据库解析xml,c#,asp.net,xml,C#,Asp.net,Xml,目前,我将xml存储在ms sql数据库中,而不是文件中。这是一个小样本 <NewDataSet> <Table1> <billTo_lastName>asdf</billTo_lastName> <orderAmount>160.00</orderAmount> <billTo_street1>asdf</billTo_street1> <card_accountNumber>#####

目前,我将xml存储在ms sql数据库中,而不是文件中。这是一个小样本

<NewDataSet>
<Table1>
<billTo_lastName>asdf</billTo_lastName>
<orderAmount>160.00</orderAmount>
<billTo_street1>asdf</billTo_street1>
<card_accountNumber>############1111</card_accountNumber>
</Table1>
</NewDataSet>

取决于您希望如何处理它。一种方法是创建一个XmlDocument,然后调用:

如果要使用Linq to Xml,请创建:


您可以将它们作为列从数据库返回到DataTable,然后使用带有ItemTemplates的任何datacontrol显示它们,例如:

declare @xml as xml
set @xml = '<NewDataSet>
<Table1>
<billTo_lastName>asdf</billTo_lastName>
<orderAmount>160.00</orderAmount>
<billTo_street1>asdf</billTo_street1>
<card_accountNumber>############1111</card_accountNumber>
</Table1>
</NewDataSet>'

;with cte as (    
  select @xml xmlstring
)
SELECT 
xmlstring.value('(/NewDataSet//Table1/billTo_lastName/node())[1]','VARCHAR(100)')
 as billTo_lastName,
xmlstring.value('(/NewDataSet//Table1/orderAmount/node())[1]','VARCHAR(20)') 
as orderAmount
FROM cte

谢谢吉姆给我指明了正确的方向。XmlDocuments加载XML工作得很好。 然后,我能够将其放入XmlNodeList并选择顶部节点。 执行XmlNode并在子节点之间循环

    DataTable dt = sqlselect(sqlQuery, parameter);
    var doc = new XmlDocument();
    doc.LoadXml(dt.Rows[0]["ua_post"].ToString());

    XmlNodeList nl = doc.SelectNodes("NewDataSet");
    XmlNode root = nl[0];

    foreach (XmlNode xnode in root.ChildNodes[0])
    {
        string name = xnode.Name;
        string value = xnode.InnerText;
        string nv = "<b>" + name + ":</b> " + value;
        Label1.Text += nv + " <br />" + Environment.NewLine;
    }

XML是否存储在数据库中的XML数据类型字段中?您的问题不是100%清楚。你需要解析数据做什么?是否要对已解析的数据进行额外处理?您希望它如何显示?字段是varchar max。这不是存储XML数据的最佳方式。如果是XML类型,则可以使用SQL函数原位查询XML。您不能使用其中一个内置数据源吗?这可能会对你有所帮助:我考虑过了。但这些数据只是信息性的。我现在真的不需要质疑它。
var element = XElement.Load(dataString);
declare @xml as xml
set @xml = '<NewDataSet>
<Table1>
<billTo_lastName>asdf</billTo_lastName>
<orderAmount>160.00</orderAmount>
<billTo_street1>asdf</billTo_street1>
<card_accountNumber>############1111</card_accountNumber>
</Table1>
</NewDataSet>'

;with cte as (    
  select @xml xmlstring
)
SELECT 
xmlstring.value('(/NewDataSet//Table1/billTo_lastName/node())[1]','VARCHAR(100)')
 as billTo_lastName,
xmlstring.value('(/NewDataSet//Table1/orderAmount/node())[1]','VARCHAR(20)') 
as orderAmount
FROM cte
    DataTable dt = sqlselect(sqlQuery, parameter);
    var doc = new XmlDocument();
    doc.LoadXml(dt.Rows[0]["ua_post"].ToString());

    XmlNodeList nl = doc.SelectNodes("NewDataSet");
    XmlNode root = nl[0];

    foreach (XmlNode xnode in root.ChildNodes[0])
    {
        string name = xnode.Name;
        string value = xnode.InnerText;
        string nv = "<b>" + name + ":</b> " + value;
        Label1.Text += nv + " <br />" + Environment.NewLine;
    }
    billTo_lastName: asdf 
    orderAmount: 160.00 
    billTo_street1: asdf 
    card_accountNumber: ############1111