XMLReader 正在跳过元素
XMLReader is skipping elements
我有以下 XML 文件(带有虚拟数据)
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="Sql statement">
<Parameters>
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
</Parameters>
</QuerySQL>
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="Sql statement">
<Parameters>
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
</Parameters>
</QuerySQL>
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="Sql statement">
<Parameters>
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
</Parameters>
</QuerySQL>
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="Sql statement">
<Parameters>
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
</Parameters>
</QuerySQL>
</Query>
问题是,第一个查询元素在我的 XMLReader 中被完美读取。
然后当它找到带有参数的查询时,它会跳过所有其他查询。
我不明白为什么。它根本没有出现在 reader 中。
这是我的reader方法;
StringReader stringReader = new StringReader(xmlString.ToString());
using (XmlReader reader = XmlReader.Create(stringReader, GetXmlReaderSettings())) {
while (reader.Read() && !reader.EOF) {
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Query")) {
if (reader.ReadToDescendant("QuerySQL")) {
m_sqlQuery = reader.GetAttribute("Sql");
m_doublePointCounter = m_sqlQuery.Split(':').Length - 1;
m_source = reader.GetAttribute("Source");
if (reader.ReadToDescendant("Parameters")) {
while (reader.ReadToFollowing("Parameter") && m_parameterCount < m_doublePointCounter) {
m_parameterCount++;
var types = reader.GetAttribute("Type");
m_paramList.Add(types);
}
}
}
}
}
我希望有人能帮我解决这个问题。
我需要的是读取每个查询元素并读取它的方法。
尝试 xml linq :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication4
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
string xml = File.ReadAllText(FILENAME);
XDocument doc = XDocument.Parse(xml);
var results = doc.Descendants("Query").Select(x => new
{
source = (string)x.Element("QuerySQL").Attribute("Source"),
sql = (string)x.Element("QuerySQL").Attribute("Sql"),
parameters = x.Descendants("Parameter").Select(y => new { type = (string)y.Attribute("Type") }).ToList()
}).ToList();
}
}
}
您的 XML 格式不正确 - 您有多个 <Query>
根标签。要使 XML 有效,您需要将重复的 <Query>
标记嵌套在根标记中。
在解决该问题之前,您无能为力 - XML 处理器 需要拒绝您的输入文件。 LINQ 未能处理它我并不感到惊讶。我很惊讶你没有从你发布的代码中得到解析错误。
ReadToFollowing
方法遍历所有 Parameter
个元素。
为避免这种情况,您需要读取子树。
if (reader.ReadToDescendant("Parameters"))
{
using (var innerReader = reader.ReadSubtree())
{
while (innerReader.ReadToFollowing("Parameter") && m_parameterCount < m_doublePointCounter)
{
m_parameterCount++;
var types = innerReader.GetAttribute("Type");
m_paramList.Add(types);
}
}
}
我有以下 XML 文件(带有虚拟数据)
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="SQL statement" />
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="Sql statement">
<Parameters>
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
</Parameters>
</QuerySQL>
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="Sql statement">
<Parameters>
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
</Parameters>
</QuerySQL>
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="Sql statement">
<Parameters>
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
</Parameters>
</QuerySQL>
</Query>
<Query>
<QuerySQL Source="Dbname" Sql="Sql statement">
<Parameters>
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
<Parameter Type="Type" />
</Parameters>
</QuerySQL>
</Query>
问题是,第一个查询元素在我的 XMLReader 中被完美读取。
然后当它找到带有参数的查询时,它会跳过所有其他查询。
我不明白为什么。它根本没有出现在 reader 中。
这是我的reader方法;
StringReader stringReader = new StringReader(xmlString.ToString());
using (XmlReader reader = XmlReader.Create(stringReader, GetXmlReaderSettings())) {
while (reader.Read() && !reader.EOF) {
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "Query")) {
if (reader.ReadToDescendant("QuerySQL")) {
m_sqlQuery = reader.GetAttribute("Sql");
m_doublePointCounter = m_sqlQuery.Split(':').Length - 1;
m_source = reader.GetAttribute("Source");
if (reader.ReadToDescendant("Parameters")) {
while (reader.ReadToFollowing("Parameter") && m_parameterCount < m_doublePointCounter) {
m_parameterCount++;
var types = reader.GetAttribute("Type");
m_paramList.Add(types);
}
}
}
}
}
我希望有人能帮我解决这个问题。
我需要的是读取每个查询元素并读取它的方法。
尝试 xml linq :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication4
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
string xml = File.ReadAllText(FILENAME);
XDocument doc = XDocument.Parse(xml);
var results = doc.Descendants("Query").Select(x => new
{
source = (string)x.Element("QuerySQL").Attribute("Source"),
sql = (string)x.Element("QuerySQL").Attribute("Sql"),
parameters = x.Descendants("Parameter").Select(y => new { type = (string)y.Attribute("Type") }).ToList()
}).ToList();
}
}
}
您的 XML 格式不正确 - 您有多个 <Query>
根标签。要使 XML 有效,您需要将重复的 <Query>
标记嵌套在根标记中。
在解决该问题之前,您无能为力 - XML 处理器 需要拒绝您的输入文件。 LINQ 未能处理它我并不感到惊讶。我很惊讶你没有从你发布的代码中得到解析错误。
ReadToFollowing
方法遍历所有 Parameter
个元素。
为避免这种情况,您需要读取子树。
if (reader.ReadToDescendant("Parameters"))
{
using (var innerReader = reader.ReadSubtree())
{
while (innerReader.ReadToFollowing("Parameter") && m_parameterCount < m_doublePointCounter)
{
m_parameterCount++;
var types = innerReader.GetAttribute("Type");
m_paramList.Add(types);
}
}
}