- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我正在阅读的 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/
我会保持简短:我正在尝试循环遍历画廊的 xml 文档。我有一个应该可以工作的脚本,但没有。谁能告诉我哪里做错了? 我不想让它变得更长,因为问题很简单,并且从昨天开始就一直在思考这个问题,这是我得到的最
我正在使用 PHPExcel从 Excel 工作表中读取数据并存储在 mysql 表中,直到现在我能够上传 .xls 和 .xlsx 文件,在上传 xls 后我得到了下面的数据表结构 name
我正在构建一个在线 Rss 阅读器。我希望能够与文章标题和描述一起显示图像。 我正在使用谷歌提要 API 从 CNN ( http://rss.cnn.com/rss/edition.rss ) 读取
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 10年前关闭。 Improve this
我正在开发 BB 应用程序,我需要在其中实现 QR 阅读器或扫描仪。我知道 RIM 在 OS6 和 ZXing 中支持它的库,但实际上我需要阅读一个示例,说明如何在我的代码中实现它。 最佳答案 你可以
我将工作应用程序的 clojurescript 版本升级到 0.0-2030,突然读取器/读取字符串返回空值,例如: (js/alert (str "reader returned [" (read
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想编写一个小应用程序,可以从任何 RSS 提要 URL 中提取 RSS 提要。如果有人能给我关于如何实现这一目标的非常基本的帮助? 我刚刚开始接触 AJAX 之类的东西,所以任何帮助将不胜感激。 谢
我已经创建了一个 RSS 阅读器,如下教程所示: http://techiedreams.com/android-rss-reader-part-3-action-bar-with-animated-
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
请帮我解决这个问题。我是 extJs 的新手,我需要一点帮助。我有这个代码 Ext.onReady(function() { var datesStore = new Ext.data.JsonSt
我需要一个 CSV 读取器,它将输出 NxN(加权)邻接矩阵(N 从一开始就不知道)。当然,我可以使用 strtok() 和 friend 来解析它,但是如果某些东西已经可用并且足够完整,我将不胜感激
实际上我想开发一个 EPUB 格式的图书列表(列表将从网络服务中检索)。 当选择一个项目(一本书)时,它应该会提示手机中安装了可用的 epub 阅读器。类似于“分享”将调用 SMS、FB、Twitte
我是 Java 的新手,但真的想在这方面做得更好。我正在尝试编写一个简单的 RSS 阅读器。这是代码: import java.io.*; import java.net.*; public clas
我按照一个简单的教程 (http://www.cse.nd.edu/courses/cse40814/www/RSS_Android.pdf) 将给定 URL 中的 RSS 提要读取到 ListVie
最近我一直在尝试学习如何在 Xcode 6 beta 中制作 RSS 阅读器应用程序的教程,尽管我使用的是 Xcode 6.1。我遇到了一行似乎是错误的。 完整代码为: import UIKit cl
代码使用条形码扫描仪检查条形码。Search_code 由用户(键盘)填写,insert_code 由条码扫描仪自动填写。目前,如果在条形码扫描仪值中引入两个输入,则代码可以工作,这对我来说不起作用。
是否可以通过编程方式更改 Windows 中的默认 PDF 阅读器。 例如, 如果我的机器中的默认阅读器是“Foxit”,但我需要在 C# 或 javascript 中将默认阅读器应用程序更改为“Ad
我想将 CSV 文件的每一行与其自身以及一列中的每一行进行比较。 例如,如果列值是这样的: 值_1 值_2 值_3 代码应该选择 Value_1 并将其与 Value_1(是的,也与它本身)、Valu
我有以下片段 import csv data = {} with open('data.csv', 'rb') as csvfile: spamreader = csv.reader(csvf
我是一名优秀的程序员,十分优秀!