gpt4 book ai didi

c# - 如何防止 XmlReader 跳到文件末尾,或者如何重置阅读器

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:49 25 4
gpt4 key购买 nike

这是我正在阅读的 XML 文件的一部分:

<?xml version="1.0"?>
<movie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" ThumbGen="1">
<hasrighttoleftdirection>false</hasrighttoleftdirection>
<title>A Nightmare on Elm Street</title>
<originaltitle>A Nightmare on Elm Street</originaltitle>
<year>1984</year>
<plot>Years after being burned alive by a mob of angry parents, child murderer Freddy Krueger returns to haunt the dreams -- and reality -- of local teenagers. As the town's teens begin dropping like flies, Nancy and her boyfriend, Glen, devise a plan to lure the monster out of the realm of nightmares and into the real world.</plot>
<tagline>A scream that wakes you up, might be your own...</tagline>
<metascore>78</metascore>
<trailer>http://www.youtube.com/watch?v=996</trailer>
<rating>8.6</rating>
<episodes />
<episodesnames />
<writers />
<gueststars />
<id>tt0087800</id>
<releasedate>11.09.1984</releasedate>
<actor>
<name>Robert Englund</name>
<name>Heather Langenkamp</name>
<name>Johnny Depp</name>
<name>Ronee Blakley</name>
<name>John Saxon</name>
<name>Amanda Wyss</name>
<name>Jsu Garcia</name>
<name>Charles Fleischer</name>
<name>Joseph Whipp</name>
<name>Lin Shaye</name>
<name>Joe Unger</name>
<name>Mimi Craven</name>
<name>David Andrews</name>
</actor>
<genre>
<name>Horror</name>
<name>Comedy</name>
</genre>
<director>
<name>Wes Craven</name>
</director>
<runtime>91</runtime>
<certification>R</certification>
<studio>
<name>New Line Cinema</name>
</studio>
<country>
<name>United States of America</name>
</country>
...
...
...
</movie>

我遇到的问题是当我检查 MPAA 时,如果它不存在,它就会运行到文件末尾,然后我就卡在那里了。并非所有电影都有 MPAA,并且出于某种原因,在这种情况下,XML 不包含空元素。

我需要弄清楚如何测试它而不丢失位置,或者如何将读者的位置重置回顶部。

我尝试了 reader.ResetState(),但出现“根元素丢失”错误。

然后,当我处理完该文件后,我不知道如何处理它以便我可以移动到列表中的下一个文件。

是的,我一团糟。

我承认我是 XML 的新手。希望您能了解下面的代码是怎么回事。对于处理这些 XML 文件的更好/替代方法的建议,我将不胜感激。我有大约 2000 个,平均 360 行 (15KB),但也有一些是 500 行 (50KB)。

public static void ProcessMovies(string wPath, string cPath, string iPath)
{
int lineID = 0;
string strMovie = null;
string strTitle = null;
string strYear = null;
string strPlot = null;
string strRating = null;
string strMPAA = null;
string strCertification = null;
string strGenre = null;

// initiates streamwriter for output file
FileInfo fi = new FileInfo(cPath + Path.DirectorySeparatorChar + "catalog.html");
StreamWriter catalog = fi.AppendText();

// pulls list of file and sorts them alphabetically
// TODO: do "library sort" that ignores The, A at beginning of title
string[] fns = Directory.GetFiles(wPath, "*.nfo");
var sort = from fn in fns
orderby new FileInfo(fn).Name ascending
select fn;

foreach (string n in sort)
{
if (lineID == 0)
catalog.WriteLine(" <tr id=\"odd\">");
else
catalog.WriteLine(" <tr id=\"even\">");
Console.WriteLine("Processing: " + n);

XmlTextReader reader = new XmlTextReader(n);

reader.ReadToFollowing("title");
strTitle = reader.ReadElementContentAsString();

reader.ReadToFollowing("year");
strYear = reader.ReadElementContentAsString();

reader.ReadToFollowing("plot");
strPlot = reader.ReadElementContentAsString();

reader.ReadToFollowing("rating");
strRating = reader.ReadElementContentAsString();

if (reader.ReadToFollowing("mpaa"))
strMPAA = reader.ReadElementContentAsString();
else
strMPAA="UNKNOWN";

// ugly code to try to read multiple embedded <name> elements within <genre>
// NOTE: Possible only 1 genre
reader.ResetState();
reader.ReadToFollowing("genre");
reader.Read();
while ((reader.Name != "genre"))
{
reader.Read();
if (reader.NodeType == XmlNodeType.Text)
strGenre += reader.Value + ", ";
}
strGenre = strGenre.Substring(0, strGenre.Length - 2);

reader.ReadToFollowing("certification");
strCertification = reader.ReadElementContentAsString();

reader.Close();

strMovie = " <td>\r\n" + " <img src=\"" + JPG_FILE_NAME + "\" width=\"75\" height=\"110\">\r\n" + " </td>\r\n" + " <td>\r\n" + " <div id=\"title\">" + strTitle + "</div>" + " <div id=\"mpaa\">" + strMPAA + "</div>" + " <div id=\"genre\">" + strGenre + "</div>" + " <div id=\"plot\">" + strPlot + "</div>" + " </td>" + " </tr>";
catalog.WriteLine(strMovie);

}
catalog.Close();
}


******************** EDIT ********************

好的,我根据 Henk 的建议将处理 XML 的代码编辑为以下内容:

var doc = XDocument.Load(n);  // takes care of all Open/Close issues
strTitle = doc.Root.Element("title") == null ? "" : doc.Root.Element("title").Value;
strYear = doc.Root.Element("year") == null ? "" : doc.Root.Element("year").Value;
strPlot = doc.Root.Element("plot") == null ? "" : doc.Root.Element("plot").Value;
strRating = doc.Root.Element("rating") == null ? "" : doc.Root.Element("rating").Value;
strMPAA = doc.Root.Element("mpaa") == null ? "" : doc.Root.Element("mpaa").Value;
strCertification = doc.Root.Element("certification") == null ? "" : doc.Root.Element("certification").Value;

效果很好,非常感谢!!!

最后一点,如何使用此方法从流派名称中获取流派?我无法搜索 name 元素,因为它用于各种元素。我不确定我是否可以使用:

doc.Root.Element("genre").ElementsAfterSelf("name");

不清楚返回什么,或者它将如何处理多个“名称”。

最佳答案

除非您的数据是 >> 100 MB,否则请将其读入 XDocument 或 XmlDocument。

使用 XmlTextReader,您无法搜索可选元素。您只能在每个元素出现时对其进行检索和存储,然后在您自己的数据结构中“搜索”您的元素。

粗略地说,使用 Sytem.Xml.Linq

 var doc = XDocument.Load(fileName);  // takes care of all Open/Close issues
string title = doc.Element("title").Value;
string mpaa = doc.Element("title") == null ? "" : doc.Element("mpaa").Value;

关于c# - 如何防止 XmlReader 跳到文件末尾,或者如何重置阅读器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6636556/

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