LINQ to XML выбор / обновление - PullRequest
1 голос
/ 13 января 2011

Если у меня есть следующий XML, как бы я использовал LINQ to XML, чтобы очистить поля даты в каждом видео узле? Я хотел сделать это с целью сравнения в модульном тесте.

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<main>
<videos>
    <video>
        <id>00000000-0000-0000-0000-000000000000</id>
        <title>Video Title</title>
        <videourl>http://sample.com</videourl>
        <thumbnail>http://sample.com</thumbnail>
        <dateCreated>2011-01-12T18:54:56.7318386-05:00</dateCreated>
        <dateModified>2011-02-12T18:54:56.7318386-05:00</dateModified>
        <Numbers>
            <Number>28</Number>
            <Number>78</Number>
        </Numbers>
    </video>
    <video>
        <id>00000000-0000-0000-0000-000000000000</id>
        <title>Video Title</title>
        <videourl>http://sample.com</videourl>
        <thumbnail>http://sample.com</thumbnail>
        <dateCreated>2011-01-12T18:54:56.7318386-05:00</dateCreated>
        <dateModified>2011-02-12T18:54:56.7318386-05:00</dateModified>
        <Numbers>
            <Number>28</Number>
            <Number>78</Number>
        </Numbers>
    </video>
</videos>

1 Ответ

2 голосов
/ 13 января 2011

Если вы просто хотите очистить содержимое узлов:

// Load the XML document
XDocument doc = ...;

// Select the date nodes
var query = doc.Descendants()
               .Where(e => e.Name.LocalName.StartsWith("date"));

// Clear the contents of each
foreach (var element in query)
{
    element.SetValue(String.Empty);
}

// Optionally write it back
doc.Save(...);

Выход:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<main>
  <videos>
    <video>
      <id>00000000-0000-0000-0000-000000000000</id>
      <title>Video Title</title>
      <videourl>http://sample.com</videourl>
      <thumbnail>http://sample.com</thumbnail>
      <dateCreated></dateCreated>
      <dateModified></dateModified>
      <Numbers>
        <Number>28</Number>
        <Number>78</Number>
      </Numbers>
    </video>
    <video>
      <id>00000000-0000-0000-0000-000000000000</id>
      <title>Video Title</title>
      <videourl>http://sample.com</videourl>
      <thumbnail>http://sample.com</thumbnail>
      <dateCreated></dateCreated>
      <dateModified></dateModified>
      <Numbers>
        <Number>28</Number>
        <Number>78</Number>
      </Numbers>
    </video>
  </videos>
</main>

К сожалению, это изменит все узлы даты, независимо от того, где они находятся в вашем XML,Лично я предпочел бы использовать запрос XPath в приведенном выше примере, если бы была указана возможность очень четко указать, какие узлы следует обновить.То же самое можно сделать, используя чистый LINQ to XML , но это не так элегантно, как этот.

var xpath = "/main/videos/video/*[starts-with(name(.),'date')]";
var query = doc.XPathSelectElements(xpath);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...