2014-11-03 34 views
1

工作时,忽略空白假设我们有以下xml文件用的SelectSingleNode和XPath

<?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文件,并且意外地在单词“novel”和双引号之间插入了一个空格,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"); 
+0

您是否特别需要使用XmlDocument和XPath?我怀疑这是可行的使用像修剪功能,但我个人建议使用LINQ到XML来代替。 – 2014-11-03 13:20:39

+0

这不是规范或任何东西,但这是我第一次尝试使用xpath,基本上这就是我设法使其工作的方式。我确信有一百万更好的方法来做到这一点。我会很感激链接到一个例子。 – 2014-11-03 13:33:23

回答

2

使用normalize-space() XPath函数:

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

这将削减任何开头或结尾的空白字符,但它也将正常化的空白字符的序列之间只是一个单一的空白。

注意:更确切地说,这仍然没有完全“忽略空白”。 Singleton空格在

<book genre="no vel"/> 

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

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

这就像一个魅力!谢谢! – 2014-11-03 13:31:41

+0

不,我想忽略多余的空格,而不是完全消除它。但谢谢你的提示。 – 2014-11-03 13:35:20

相关问题