如何解析XML文件
我有一个看起来像一个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>
<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>
...而且我对如何读它很迷茫。我只想将标题,说明和URL分为不同的字符串。喜欢的东西:
foreach line in lines
string title = gettitle;
string description = getdescription;
string url = geturl;
...我已经看了这么多教程,但所有的人似乎并不相对于什么,我需要做的..有人可以帮我这个?
到LINQ扩展到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);
在这种情况下,links
将有一个匿名类型对象的可序列Description
和Url
属性,其中Url
已解码。这foreach
会显示这样的事情:
<a href="http://www.jason.org/Public/News/News.aspx">News</a>
<a href="http://www.jason.org/public/registration/registration.aspx">register</a>
...
非常感谢你@dahlbyk,但有一个错误,我完全不知道他们的意思(ive从来没有做过什么与linq或xml之前)...你能帮我找出这些错误是什么意思?它说“HttpUtility在当前上下文中不存在”。请帮助... +1 – 2009-10-11 03:55:03
HttpUtility生活在System.Web - 在你的文件的顶部,确保你有:using System.Web; – dahlbyk 2009-10-11 05:02:03
我实际上做到了这一点,但仍然是同样的问题... – 2009-10-11 05:17:47
如果您使用的是.NET 3.5,我建议使用LINQ to XML ...
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");
(根据注释编辑)
对于L2XML的+1。建议将字符串转换为字符串,而不是.Value以避免null问题:(string)insideLink.Element(“description”) – dahlbyk 2009-10-11 03:10:25
感谢您指出这一点,我不知道这是可能的。 (这也导致我搜索了一个关于重载演员操作符的Google搜索,我也不知道在C#中可以使用D) – 2009-10-11 03:23:28
很高兴能够提供帮助!没有足够的图书馆提供智能转换,因此人们不会考虑使用它们,但XElement绝对是正确的(字符串,值和可空类型)。 – dahlbyk 2009-10-11 03:32:01
试试这个:
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;
}
}
比你这个,虽然我一直收到一个错误,当调试说xml文件中有多个根元素...你知道这意味着什么吗? – 2009-10-11 03:34:09
你的xml不是良构;你必须只有一个根元素 – 2009-10-11 03:55:46
谢谢@Rubens :)生病了解决了 – 2009-10-11 04:15:51
感谢约翰·桑德斯,我为这是一个重复的道歉,但我只是不明白,我在S/O – 2009-10-11 03:49:57
我删除了我的评论中发现其他的答案;我建议你删除你的评论以及 – 2015-06-21 04:31:08