【问题标题】:How to use XDocument to Read Multiple Embeded Elements如何使用 XDocument 读取多个嵌入元素
【发布时间】:2011-07-09 21:05:08
【问题描述】:

这是我正在阅读的 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>

感谢 Henk Holterman,我能够清理处理 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;

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

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

不清楚返回的内容(我不太了解如何使用 IEnumberables),或者它如何处理多个“名称”。我认为它可以使用 LINQ 完成,但我仍在尝试弄清楚如何使用它。

非常感谢!!

【问题讨论】:

  • 这确实是一个新问题,你只是复制了上一个问题的所有内容。请进行编辑,使其本身有意义。
  • 如果我是你,我会编写一个单独的函数,例如 private string emptyOrValue(s) { return s == null ? string.Empty : s; }。相同的代码,但会大大清理你上面的混乱。你也可以通过(T)doc.Root.Element("year") 等来提取 T 类型的值。

标签: c# xml linq ienumerable linq-to-xml


【解决方案1】:

您可以获得流派列表:

// untested
List<string> genres = doc.Root
      .Element("genre")
      .Elements("name")
      .Select(x => x.Value).ToList(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多