读取XML中的特定节点并传递给sql server中的Stored Procedure

时间:2016-05-02 05:55:55

标签: c# sql-server xml stored-procedures

我有一个XML文件,我想在其中从动态传递名称的节点中提取数据。收到节点名称后,我想用节点名称提取节点的数据,并将其传递给存储过程。以下是我的代码。我从来没有这样做过,所以请你解释一下如何去做。

string yourpath = Environment.CurrentDirectory + @"\DataItemTables.xml";
            System.Xml.Linq.XDocument myxml = System.Xml.Linq.XDocument.Load(yourpath);

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(myxml.ToString());
            XmlNodeList xnList = doc.SelectNodes("/abc/Abcd/Segment[@Name='AAA']");
            foreach (XmlNode xn in xnList)
            {
                if (xn.HasChildNodes)
                {
                    foreach (XmlNode item1 in xn.ChildNodes)
                    {
                        Console.WriteLine(item1.InnerText);
                    }
                }
            }

以下是我的XML

<Tables>
  <Table name="Test">
    <tablename>TestTable</tablename>
    <refTable>NULL</refTable>
    <refTableIDColumn>NULL</refTableIDColumn>
  </Table>
  <Table name="Test">
    <tablename>OutlineURL</tablename>
    <refTable>TestTable</refTable>
    <refTableIDColumn>TestTableID</refTableIDColumn>
  </Table>
  <Table name="Test">
    <tablename>OutlineSummary</tablename>
    <refTable>TestTable</refTable>
    <refTableIDColumn>TestTableID</refTableIDColumn>
  </Table>
  <Table name="Test">
    <tablename>TestForm</tablename>
    <refTable>TestTable</refTable>
    <refTableIDColumn>TestTableID</refTableIDColumn>
  </Table>
</Tables>

我正在使用谷歌的一些代码。我想读取具有动态传递的名称的节点。从中提取所有数据,并将数据作为XML参数发送到存储过程。

2 个答案:

答案 0 :(得分:1)

我仍然不知道你想要达到的目标,但是这段代码可以获得给定节点及其所有子节点的内容:

我更改了您的示例,让“name”属性具有不同的值。我会读到“Test2”:

在变量“dummy”中,您可以检查内容。

string s = "<Tables>" +
                "<Table name='Test1'>" +
                "<tablename>TestTable</tablename>" +
                "<refTable>NULL</refTable>" +
                "<refTableIDColumn>NULL</refTableIDColumn>" +
                "</Table>" +
                "<Table name='Test2'>" +
                "<tablename>OutlineURL</tablename>" +
                "<refTable>TestTable</refTable>" +
                "<refTableIDColumn>TestTableID</refTableIDColumn>" +
                "</Table>" +
                "<Table name='Test3'>" +
                "<tablename>OutlineSummary</tablename>" +
                "<refTable>TestTable</refTable>" +
                "<refTableIDColumn>TestTableID</refTableIDColumn>" +
                "</Table>" +
                "<Table name='Test4'>" +
                "<tablename>TestForm</tablename>" +
                "<refTable>TestTable</refTable>" +
                "<refTableIDColumn>TestTableID</refTableIDColumn>" +
                "</Table>" +
            "</Tables>";
var ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(s)); ;
System.Xml.Linq.XDocument myxml = System.Xml.Linq.XDocument.Load(ms);

XmlDocument doc = new XmlDocument();
doc.LoadXml(myxml.ToString());
XmlNodeList xnList = doc.SelectNodes("/Tables/Table[@name='Test2']");
foreach (XmlNode xn in xnList) {
    var dummy = xn.OuterXml;
}

答案 1 :(得分:0)

您可以尝试关注SQL XML query,它会将XML片段解析为表格数据,然后您可以在其上查询

declare @xml xml = N'
<Tables>
  <Table name="Test">
    <tablename>TestTable</tablename>
    <refTable>NULL</refTable>
    <refTableIDColumn>NULL</refTableIDColumn>
  </Table>
  <Table name="Test">
    <tablename>OutlineURL</tablename>
    <refTable>TestTable</refTable>
    <refTableIDColumn>TestTableID</refTableIDColumn>
  </Table>
  <Table name="Test">
    <tablename>OutlineSummary</tablename>
    <refTable>TestTable</refTable>
    <refTableIDColumn>TestTableID</refTableIDColumn>
  </Table>
  <Table name="Test">
    <tablename>TestForm</tablename>
    <refTable>TestTable</refTable>
    <refTableIDColumn>TestTableID</refTableIDColumn>
  </Table>
</Tables>'

SELECT
 [Table].value('tablename[1]','varchar(100)') AS tablename,
 [Table].value('refTable[1]','varchar(100)') AS refTable,
 [Table].value('refTableIDColumn[1]','varchar(100)') AS refTableIDColumn
FROM @XML.nodes('Tables/Table') TablesList([Table])

我希望它有所帮助,