Получить атрибут XML с C # - PullRequest
       8

Получить атрибут XML с C #

1 голос
/ 20 января 2011

У меня есть XML-файл, подобный следующему.

<div class="time">
   <span class="title">Bla: </span>
   <span class="value">Thu 20 Jan 11</span>
</div>

Как я могу получить значение "Чт 20 января 11" с C #? заранее спасибо

Ответы [ 8 ]

1 голос
/ 20 января 2011

Учитывая, что у вас есть XML-файл, как вы сказали, вам нужно загрузить файл в XmlDocument и найти то, что вы хотите, используя 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();
        }
    }

Вывод: чт 20 января 11

1 голос
/ 20 января 2011

Звучит так, будто вам скорее нужен HTML-парсер ИМХО.если так, то взгляните на Html Agility Pack

0 голосов
/ 23 января 2011

Хорошо, ребята, я помещаю фрагмент кода. Проблема в том, что когда я использую XPath: // @ *, я получаю весь список правильно. Также я попытался // @ class, и он вернул все значения класса - ОК. Но когда я поставил // 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>
0 голосов
/ 21 января 2011

Ниже приведен код в 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));
0 голосов
/ 20 января 2011

Это ответ 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();
0 голосов
/ 20 января 2011

Как уже говорилось, вы можете разобрать его как HTML.

Однако, рассматривая его как документ XML, вы можете прочитать значение из узла, используя XPath: / div / span [@ class = "value"]

Вы также можете использовать XDocument для выбора значения узла из известного XPath или путем поиска через узлы-потомки.Используя LINQ, это становится очень легко сопоставить по значению атрибута. Ссылка здесь

0 голосов
/ 20 января 2011

Использование запросов XPath также может быть элегантным решением.См. Эту статью базы знаний для краткого практического руководства: http://support.microsoft.com/kb/308333

Это, конечно, требует, чтобы документ был строго правильным XML, которым является XHTML.К сожалению, ввод HTML часто содержит синтаксические ошибки ...

Cheers, Matthias

0 голосов
/ 20 января 2011

Я написал небольшой фрагмент, который делает это для вас ...

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());
}
...