用c#从SQLite数据库中读取带有名称空间的xml数据

本文关键字:空间 有名称 xml 数据 读取 SQLite 数据库 | 更新日期: 2023-09-27 18:16:06

我遇到了一个来自具有两个名称空间的SQLite数据库的XML结构。当没有属性名称存在时,我如何引用"floatnumber"(秒ns后面)?

<?xml version="1.0" encoding="utf-8"?>
<anyType xmlns:q1="http://www.w3.org/2001/XMLSchema"
         d1p1:type="q1:string" 
         xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance">
   floatnumber
 </anyType>

连接包v1.0.98.0从https://system.data.sqlite.org/到SQLite数据库是直接的。我在玩XmlReader和XDocument (LINQ-to-XML),但没有成功。

在c#中从xml中读取'floatnumber'(数据库列'Value')的最佳方法是什么?

using (SQLiteCommand sqlcmd = new SQLiteCommand())
{
    sqlcmd.Connection = connect;
    sqlcmd.CommandText = sqlquery;
    SQLiteDataReader rdr = null;
    try
    {
        rdr = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection);
        while (rdr.Read())
        {
            string xmlstr = rdr["Value"].ToString();
            Console.WriteLine(xmlstr);                  // gives whole xml structure
            /* code to get floatnumber from xml */
        }
    }
    catch ()
    {}
}

我在这里的第一篇文章。汤姆

用c#从SQLite数据库中读取带有名称空间的xml数据

使用XML Linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xmlstr =
                "<?xml version='"1.0'" encoding='"utf-8'"?>" +
                "<anyType xmlns:q1='"http://www.w3.org/2001/XMLSchema'"" +
                      " d1p1:type='"q1:string'"" +
                      " xmlns:d1p1='"http://www.w3.org/2001/XMLSchema-instance'">" +
                      "floatnumber" +
               "</anyType>";
            XDocument doc = XDocument.Parse(xmlstr);
            XElement anyType = (XElement)doc.FirstNode;
            XNamespace ns = anyType.Name.Namespace;
            XNamespace q1 = anyType.Attributes().Where(x => x.Name.LocalName == "q1").FirstOrDefault().Name.Namespace;
            XNamespace type = anyType.Attributes().Where(x => x.Name.LocalName == "type").FirstOrDefault().Name.Namespace;
            XNamespace d1p1 = anyType.Attributes().Where(x => x.Name.LocalName == "d1p1").FirstOrDefault().Name.Namespace;
            string floatnumber = anyType.Value;
        }
    }
}​

从提供的XML anyType NOT是否有名称空间。它确实定义了两个名称空间q1d1p1,但它们不用于引用元素。下面的示例使用XPath表达式来获取元素。您也可以使用Linq to XML。

Using System.Xml;
var doc = new XmlDocument();
doc.LoadXml(xmlstr);
var floatnumber = doc.SelectSingleNode("anyType[content() = 'floatnumber']");

string s = doc.SelectSingleNode("anyType").Value;
double d = XmlConvert.ToDouble(s);