C# 如何解析XML文件

C# 如何解析XML文件,c#,.net,xml,C#,.net,Xml,我有一个XML文件,看起来像: <results> <result> <title>Welcome+to+The+JASON+Project%21</title> <url>http%3A%2F%2Fwww.jason.org%2F</url> <domain /> <inside_links> <inside_link

我有一个XML文件,看起来像:

  <results>
    <result>
      <title>Welcome+to+The+JASON+Project%21</title>
      <url>http%3A%2F%2Fwww.jason.org%2F</url>
      <domain />
      <inside_links>
        <inside_link>
          <description>News</description>
          <url>http%3A%2F%2Fwww.jason.org%2FPublic%2FNews%2FNews.aspx</url>
        </inside_link>
        <inside_link>
          <description>register</description>
          <url>http%3A%2F%2Fwww.jason.org%2Fpublic%2Fregistration%2Fregistration.aspx</url>
        </inside_link>
        <inside_link>
          <description>Argonauts</description>
          <url>http%3A%2F%2Fwww.jason.org%2FPublic%2FArgonauts%2FArgonauts.aspx</url>
        </inside_link>
        <inside_link>
          <description>Curriculum</description>
          <url>http%3A%2F%2Fwww.jason.org%2FPublic%2FCurriculum%2FCurriculum.aspx</url>
        </inside_link>
        <inside_link>
          <description>Credits</description>
          <url>http%3A%2F%2Fwww.jason.org%2Fpublic%2FMisc%2FCredits.aspx</url>
        </inside_link>
      </inside_links>
      <inside_keywords>National+Science+Education+Standards, National+Geographic+Society, Physical+Science, Professional+Development, Earth+Science</inside_keywords>
    </result>
  </results>

…我读了很多教程,但它们似乎都与我需要做的事情无关。。有人能帮我一下吗?

如果您使用的是.NET3.5,我建议您使用LINQtoXML

XDocument doc = XDocument.Load(filename);
XElement insideLinks = doc.Root.Element("result").Element("inside_links");
foreach (XElement insideLink in insideLinks.Elements())
{
    string description = (string)insideLink.Element("description");
    string url = (string)insideLink.Element("url");
}
这还允许您使用内置的“查询”语法,以便您可以执行以下操作

XDocument doc = XDocument.Load(filename);
XElement insideLinks = doc.Root.Element("result").Element("inside_links");
var allTitles = from XElement insideLink 
                in insideLinks.Elements("inside_link")
                select (string)insideLink.Element("title");

(按评论编辑)

如果您使用的是.NET3.5,我建议您使用LINQtoXML

XDocument doc = XDocument.Load(filename);
XElement insideLinks = doc.Root.Element("result").Element("inside_links");
foreach (XElement insideLink in insideLinks.Elements())
{
    string description = (string)insideLink.Element("description");
    string url = (string)insideLink.Element("url");
}
这还允许您使用内置的“查询”语法,以便您可以执行以下操作

XDocument doc = XDocument.Load(filename);
XElement insideLinks = doc.Root.Element("result").Element("inside_links");
var allTitles = from XElement insideLink 
                in insideLinks.Elements("inside_link")
                select (string)insideLink.Element("title");
(根据评论编辑)

尝试以下操作:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("yourfile.xml");
foreach (XmlNode result in xmlDoc.SelectNodes("/results/result"))
{
    string title = result.SelectSingleNode("title").InnerText;
    string url = result.SelectSingleNode("url").InnerText;
    foreach (XmlNode insideLink in result.SelectNodes("inside_links/inside_link"))
    {
        string description = insideLink.SelectSingleNode("description").InnerText;
    }
}
试试这个:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("yourfile.xml");
foreach (XmlNode result in xmlDoc.SelectNodes("/results/result"))
{
    string title = result.SelectSingleNode("title").InnerText;
    string url = result.SelectSingleNode("url").InnerText;
    foreach (XmlNode insideLink in result.SelectNodes("inside_links/inside_link"))
    {
        string description = insideLink.SelectSingleNode("description").InnerText;
    }
}

要扩展LINQ To XML建议,可以使用select子句创建表示已解析链接的对象:

XDocument doc = XDocument.Load(filename);
var links = from link in doc.Descendants("inside_link")
            select new
            {
                Description = (string)link.Element("description"),
                Url = HttpUtility.UrlDecode((string)link.Element("url"))
            };

foreach(var l in links)
    Console.WriteLine("<a href=\"{0}\">{1}</a>", l.Url, l.Description);

要扩展LINQ To XML建议,可以使用select子句创建表示已解析链接的对象:

XDocument doc = XDocument.Load(filename);
var links = from link in doc.Descendants("inside_link")
            select new
            {
                Description = (string)link.Element("description"),
                Url = HttpUtility.UrlDecode((string)link.Element("url"))
            };

foreach(var l in links)
    Console.WriteLine("<a href=\"{0}\">{1}</a>", l.Url, l.Description);


+L2XML为1。建议使用string而不是.Value来避免空问题:(string)insideLink.Element(“description”)感谢您指出这一点,我不知道这是可能的。(这也让我在谷歌上搜索到了关于重载cast操作符的内容,我也不知道这在C#:D中是可能的)很高兴能帮上忙!没有足够的库提供智能强制转换,所以人们不想使用它们,但XElement确实做得很好(字符串、值和可空类型)。+1表示L2XML。建议使用string而不是.Value来避免空问题:(string)insideLink.Element(“description”)感谢您指出这一点,我不知道这是可能的。(这也让我在谷歌上搜索到了关于重载cast操作符的内容,我也不知道这在C#:D中是可能的)很高兴能帮上忙!没有足够的库提供智能强制转换,所以人们不想使用它们,但XElement确实做得很好(字符串、值和可空类型)。尽管我在调试时不断收到一个错误,说xml文件中有多个根元素。。。你知道这意味着什么吗?你的xml格式不好;您必须只有一个根元素Thank you@Rubens:)我将修复yourfile.xml应该在哪里?的问题,尽管我在调试时一直收到一个错误,说xml文件中有多个根元素。。。你知道这意味着什么吗?你的xml格式不好;您必须只有一个根元素Thank you@Rubens:)我将修复yourfile.xml应该在哪里?谢谢john saunders,我为这是一个重复的内容表示歉意,但我只是不理解我在s/oI上找到的其他答案,我删除了我的评论;我建议你也删除你的评论谢谢john saunders,我为这是一个重复道歉,但我只是不明白我在s/oI上找到的其他答案删除了我的评论;我建议你也删除你的评论,非常感谢@dahlbyk,但是有一个错误,我完全不知道它们的意思(我以前从未用linq或xml做过任何事情)。。。你能帮我弄清楚这些错误是什么意思吗?它说“HttpUtility在当前上下文中不存在。”请帮助+1HttpUtility存在于System.Web中-在文件的顶部确保有:使用System.Web;我确实这样做了,但还是有同样的问题…你需要在你的项目中添加一个引用System.Web.dll。耶!你做到了谢谢你,谢谢你的礼物Chansik Im:D:D:D:D:D..非常感谢。。我有点困惑,为什么即使在键入system.web之后也需要手动添加引用,但我在s/o上发现的另一个问题为我解答了这个问题。非常感谢@dahlbyk,但是有一个错误,我完全不知道它们的意思(我以前从未使用linq或xml做过任何事情)。。。你能帮我弄清楚这些错误是什么意思吗?它说“HttpUtility在当前上下文中不存在。”请帮助+1HttpUtility存在于System.Web中-在文件的顶部确保有:使用System.Web;我确实这样做了,但还是有同样的问题…你需要在你的项目中添加一个引用System.Web.dll。耶!你做到了谢谢你,谢谢你的礼物Chansik Im:D:D:D:D:D..非常感谢。。我有点困惑,为什么即使在键入system.web之后也需要手动添加引用,但我在s/o上发现的另一个问题为我解答了这个问题。