Создайте новый XMLDocument, отфильтровав существующий документ в c # с помощью xpath. - PullRequest
4 голосов
/ 09 октября 2010

У меня есть ситуация, когда я получаю XML-файл (документ) от сторонней компании. Мне нужно отфильтровать документ, чтобы удалить все данные, которые меня не интересуют. Файл размером около 500 КБ, но будет запрашиваться очень часто.

скажем, следующий файл:

<dvdlist>
  <dvd>
    <title>title 1</title>
    <director>directory 2</director>
    <price>1</price>
    <location>
      <city>denver</city>
    </location>
  </dvd>
  <dvd>
    <title>title 2</title>
    <director>directory 2</director>
    <price>2</price>
    <location>
      <city>london</city>
    </location>
  </dvd>
  <dvd>
    <title>title 3</title>
    <director>directory 3</director>
    <price>3</price>
    <location>
      <city>london</city>
    </location>
  </dvd>
</dvdlist>

Мне нужно просто отфильтровать документ на основе city = london , чтобы в итоге получить этот новый XML-документ

<dvdlist>
  <dvd>
    <title>title 2</title>
    <director>directory 2</director>
    <price>2</price>
    <location>
      <city>london</city>
    </location>
  </dvd>
  <dvd>
    <title>title 3</title>
    <director>directory 3</director>
    <price>3</price>
    <location>
      <city>london</city>
    </location>
  </dvd>
</dvdlist>

Я пробовал следующее

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Development\Website\dvds.xml");
XmlNode node = doc.SelectSingleNode("dvdlist/dvd/location/city[text()='london']");

Любая помощь или ссылки оценят

Спасибо

Ответы [ 2 ]

2 голосов
/ 09 октября 2010

XPath - это язык выражения выбора - он никогда не изменяет документ XML (s), на которых он работает.

Поэтому, чтобы получить желаемый новый XML-документ, вам нужно либо использовать XML DOM (не рекомендуется), либо применить XSLT-преобразование к XML-документу. Последний способ рекомендуется, поскольку XSLT - это язык, специально разработанный для преобразования деревьев.

В .NET можно использовать метод XslCompiledTransform class и его Transform () . Подробнее об этом читайте в соответствующей документации MSDN .

Само преобразование XSLT предельно просто :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="dvd[not(location/city='london')]"/>
</xsl:stylesheet>

Здесь , вы можете найти полный пример кода, как получить результат преобразования в виде XmlDocument (или, если необходимо, в качестве XDocument).

0 голосов
/ 09 октября 2010

Вот пример использования LINQ to XML.

//load the document
var document = XDocument.Load(@"C:\Development\Website\dvds.xml");
//get all dvd nodes
var dvds = document.Descendants().Where(node => node.Name == "dvd");
//get all dvd nodes that have a city node with a value of "london"
var londonDVDs = dvds.Where(dvd => dvd.Descendants().Any(child => child.Name == "city" && child.Value == "london"));
...