gpt4 book ai didi

c# - Xml 阅读器跳过值

转载 作者:太空狗 更新时间:2023-10-30 01:05:45 26 4
gpt4 key购买 nike

我有以下 XML 片段-

-<Row>
<RowType Id="1"Label="Scotland">1985</RowType>
<Year Id="11"Label="1994"/>
<Value Id="123">18</Value>
<Field Id="123"Label="Country">16</Field>
<Field Id="123"Label="Soccer">Yes</Field>
</Row>
-<Row>
<RowType Id="1"Label="England">1986</RowType>
<Year Id="11"Label="1994"/>
<Value Id="123">19</Value>
<Field Id="123"Label="Country">16</Field>
<Field Id="123"Label="Soccer">Yes</Field>
</Row>
-<Row>
<RowType Id="1"Label="Wales">1987</RowType>
<Year Id="11"Label="1994"/>
<Value Id="123">20</Value>
<Field Id="123"Label="Country">16</Field>
<Field Id="123"Label="Soccer">Yes</Field>
</Row>

我正在使用 XmlReader 从中检索特定数据 -

using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
{
string country = "";
string Year = "";
string count = "";
string tss= "";
string tss2 = "";


reader.MoveToContent();
while (reader.Read())
{

reader.ReadToFollowing("RowType");
country = reader.GetAttribute("Label");
country = country.Replace("'", "");

reader.ReadToFollowing("Year");
Year = reader.GetAttribute("Label");

reader.ReadToFollowing("Value");
count = reader.ReadElementContentAsString();

reader.ReadToFollowing("Field");
tss = reader.GetAttribute("Label");

reader.ReadToFollowing("Field");
tss2 = reader.GetAttribute("Label");
}
}

这对于第一次迭代工作正常,但是在第二次迭代中,它从 XML 中的第三行检索值,并继续跳到它应该解析的那一行之后的下一行。

我该如何解决?

最佳答案

其实你的代码是对的;不正确的是文档的结构。或者更好的是,您的代码不考虑文档的特定结构。

您可以通过添加以下位来更改它:

XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (XmlReader reader = XmlReader.Create(new StringReader(xml), settings))

默认情况下,XMLReader 需要 ConformanceLevel.Document,因此该文件应该具有如下结构:

<main>
<Row id="5">
<RowType Id="1" Label="Scotland">1985</RowType>
<Year Id="11" Label="1994"/>
<Value Id="123">18</Value>
<Field Id="123" Label="Country">16</Field>
<Field Id="123" Label="Soccer">Yes</Field>
</Row>
<Row id="1">
<RowType Id="1" Label="England">1986</RowType>
<Year Id="11" Label="1994"/>
<Value Id="123">19</Value>
<Field Id="123" Label="Country">16</Field>
<Field Id="123" Label="Soccer">Yes</Field>
</Row>
<Row id="4">
<RowType Id="1" Label="Wales">1987</RowType>
<Year Id="11" Label="1994"/>
<Value Id="123">20</Value>
<Field Id="123" Label="Country">16</Field>
<Field Id="123" Label="Soccer">Yes</Field>
</Row>
</main>

我了解元素之间缺乏分隔(例如,Id="1"Label="Scotland" 而不是 Id="1"Label="Scotland") 是一个错字,因为在任何情况下都必须存在分隔。

-------------------- 更新

您报告说,即使更改了一致性级别,您的代码也没有提供预期的结果。我已经对您的代码进行了新的测试,并且运行良好;至少,它正确地迭代。因此,据我了解,您想要检索的值与您的代码所做的不同(它混合了应用程序名称、属性和内容)。

下面你可以看到我自己的代码(虽然我坚持认为你的代码也可以遍历给定的信息),它比你的更具适应性;我还在我认为您想要检索的信息与您的代码所做的不同的部分中加入了一些注释。基本思想只是从内容(内容)中检索信息,但您的代码可以从任何地方获取它。

        string path = @"XML file";
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (XmlReader reader = XmlReader.Create(path, settings))
{
string country = "";
string Year = "";
string count = "";
string tss = "";
string tss2 = "";

while (reader.ReadToFollowing("Row"))
{
XmlReader reader2 = reader.ReadSubtree();
while (reader2.Read())
{
if (reader2.NodeType == XmlNodeType.Element)
{
if (reader2.Name == "RowType")
{
country = reader2.GetAttribute("Label");
country = country.Replace("'", ""); //country_year = reader.ReadElementContentAsString(); -> "Scotland" -> 1985
}
else if (reader2.Name == "Year")
{
//IF XML IS -> <Year Id="11">1994<Year/>
//Then -> Year = reader2.GetAttribute("Label")
Year = reader2.GetAttribute("Label"); //-> 1994
}
else if (reader2.Name == "Value")
{
count = reader2.ReadElementContentAsString();
}
else if (reader2.Name == "Field")
{
if (reader2.GetAttribute("Label") == "Country")
{
tss = reader2.ReadElementContentAsString(); //I understand that this is what you want to read, instead the Label name
}
else if (reader2.GetAttribute("Label") == "Soccer")
{
tss2 = reader2.ReadElementContentAsString();//I understand that this is what you want to read, instead the Label name
}
}
}
}
}
}

这应该提供您正在寻找的东西;或者,在最坏的情况下,对于如何处理 XML 读取有一个非常清晰的想法。另外,为了以防万一,包含一个 try...catch 可能是一件好事;请注意,读取/处理变量时的任何错误都会导致读取过程立即停止。

关于c# - Xml 阅读器跳过值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17452255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com