使用SelectSingleNode和Xpath时忽略空格

时间:2014-11-03 13:18:21

标签: c# xml xpath

我们假设我们有以下xml文件

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
  <book genre="novel" publicationdate="1997" ISBN="1-861001-57-8">
    <title>Pride And Prejudice</title>
    <author>
      <first-name>Jane</first-name>
      <last-name>Austen</last-name>
    </author>
    <price>24.95</price>
  </book>
  <book genre="textbook" publicationdate="2013" ISBN="1-861002-30-1">
    <title>Head First C#</title>
    <author>
      <first-name>Jennifer</first-name>
      <last-name>Greene</last-name>
    </author>
    <price>29.95</price>
  </book>
</bookstore>

我想检查属性book的元素genre="novel"是否存在,是否存在。

我已经编写了以下代码,它的工作非常精彩。但是,如果有人编辑了xml文件并意外地在单词&#34; novel&#34;之间留出了额外的空格。和双引号,genre=" novel ",或者让我们说我是一个白痴,并在创建属性值时添加了额外的空间,xpath不再有效当一个节点已经存在时,代码将添加一个节点。有没有办法以忽略空格的方式使用SelectSingleNode

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\anonymous\Documents\file.xml");

string xpath = @"/bookstore/book [@genre='novel']";
var rootNode = doc.SelectSingleNode(@"/bookstore");
var bookNode = doc.SelectSingleNode(xpath);

if (bookNode == null)
{
  XmlNode newNode = doc.CreateElement("book");
  XmlAttribute genreAttribute = doc.CreateAttribute("genre");
  genreAttribute.Value = @"novel";
  newNode.Attributes.Append(genreAttribute);
  rootNode.AppendChild(newNode);
}
doc.Save(@"C:\Users\anonymous\Documents\file.xml");

1 个答案:

答案 0 :(得分:2)

使用normalize-space() XPath函数:

string xpath = @"/bookstore/book [normalize-space(@genre)='novel']";

这将修剪任何前导或尾随空白字符,但它也会将其间的任何空格字符序列规范化为仅一个空格。

注意:更确切地说,这仍然不能完全忽略空白&#34;。单身空白如

中所示
<book genre="no vel"/>

将保留并且相关。如果您想完全忽略空格,可以使用translate()函数:

string xpath = @"/bookstore/book [translate(@genre,' ','')='novel']";