C# 使用C获取XML属性
我有一个如下所示的XML文件C# 使用C获取XML属性,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有一个如下所示的XML文件 <div class="time"> <span class="title">Bla: </span> <span class="value">Thu 20 Jan 11</span> </div> 如何在2011年1月20日星期四用C获得值? 提前感谢听起来您需要一个HTML解析器。 如果是这样的话,请看一看我写的一个小片段,它为您提供了帮助 public void Test(S
<div class="time">
<span class="title">Bla: </span>
<span class="value">Thu 20 Jan 11</span>
</div>
如何在2011年1月20日星期四用C获得值?
提前感谢听起来您需要一个HTML解析器。
如果是这样的话,请看一看我写的一个小片段,它为您提供了帮助
public void Test(String source)
{
XElement elem = XElement.Parse(source);
var query = (from x in elem.Descendants("span") select x.Value).LastOrDefault();
Console.WriteLine(query.ToString());
}
使用XPath查询也可能是一个优雅的解决方案。请参阅这篇知识库文章,了解简要的操作方法: 这当然要求文档必须是严格正确的XML,XHTML就是这样。不幸的是,HTML输入经常包含语法错误 干杯,
Matthias假设您确实有一个如您所说的XML文件,那么您需要将该文件加载到一个XML文档中,并使用XPath查找所需内容:
class Program
{
static void Main(string[] args)
{
var xml = "<div class=\"time\">" +
"<span class=\"title\">Bla: </span>" +
"<span class=\"value\">Thu 20 Jan 11</span>" +
"</div>";
var document = new XmlDocument();
try
{
document.LoadXml(xml);
}
catch (XmlException xe)
{
// Handle and/or re-throw
throw;
}
var date = document.SelectSingleNode("//span[@class = 'value']").InnerText;
Console.WriteLine(date);
Console.ReadKey();
}
}
输出:Thu 20 Jan 11如前所述,您可以将其解析为HTML 但是,如果将其视为XML文档,则可以使用XPath从节点读取值: /div/span[@class=value]
您还可以使用XDocument从已知XPath中选择节点值,或者通过搜索子节点来选择节点值。使用LINQ,可以很容易地匹配属性值 这是sgrassie的答案,但使用linq to xml,我更喜欢这段代码,但这取决于您
string xml = "<div class=\"time\"><span class=\"title\">Bla: </span><span class=\"value\">Thu 20 Jan 11</span></div>";
StringReader sr = new StringReader(xml);
XDocument xdoc = XDocument.Load(sr);
var date = xdoc.Element("div").Elements("span").Where(m => ((string)m.Attribute("class")) == "value").FirstOrDefault();
Console.WriteLine(date.Value);
Console.ReadLine();
以下是VTD-XML中的代码:
VTDGen vg = new VTDGen();
System.Text.Encoding eg = System.Text.Encoding.GetEncoding("UTF-8");
String XML = "<div class=\"time\">" +
"<span class=\"title\">Bla: </span>" +
"<span class=\"value\">Thu 20 Jan 11</span>" +
"</div>";
vg.setDoc(eg.GetBytes(XML));
vg.parse(true);
VTDNav vn = vg.getNav();
AutoPilot ap = new AutoPilot(vn);
ap.selectXPath("/div/span[@class='value']/text()");
int i = ap.evalXPath();
if (i!=-1)
Console.WriteLine(vn.toString(i));
好的,伙计们,我把代码片段放进去。问题是,当我使用XPath://*时,我正确地获取了所有列表。我还尝试了/@class,它返回了所有类的值-OK。但当我放入//span[@class='value']时,我得到了一个空白列表。 此外,我还尝试了几种变体,当我将属性设置为某物//title[@type='html']时,似乎得到了一个空白列表
<feed xmlns="w3.org/2005/Atom">
<updated>2011-01-20T08:33:23Z</updated>
<title type="html">grgrgr</title>
<entry>
<title type="html">Blog post : Estiatoria</title>
<content type="xhtml">
<div xmlns="w3.org/1999/xhtml">
<div class="due">
<span class="title">Due:</span>
<span class="value">20 Jan 11</span>
</div>
</div>
</content>
</entry>
</feed>
这些是xml节点的名称吗?对我来说,这听起来更像是HTML…问题是我正在尝试解析一个Atom RSS提要,它包含上面所述的嵌套HTML代码:或者如果您需要更具体一些,并且要求span与该特定类位于div中,那么请使用XPath://div[@class='time']/span[@class='value']Hi,我已经试过你的代码,它工作得很好,因为它是。。。。但是当我试图加载一个包含嵌套html的Atom RSS提要时。。。它在根级别抛出的数据无效。第1行,位置1。当我运行代码时,它给我一个根级别的数据是无效的。第1行,位置1。在LinqPad中使用query.Dump进行测试,工作正常。别忘了在源字符串中转义这些“”,就像这样…-2011-01-20T08:33:23Z GRGRGRGR-Blog post:Estiatoria----截止日期:2011年1月20日