Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C获取XML属性_C#_Xml_Linq To Xml - Fatal编程技术网

C# 使用C获取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

我有一个如下所示的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(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日