假设我们有以下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文件并意外地在单词“ 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");
最佳答案
使用normalize-space()
XPath函数:
string xpath = @"/bookstore/book [normalize-space(@genre)='novel']";
这将修剪所有前导或尾随的空白字符,但也将它们之间的任何空白字符序列标准化为一个空白。
注意:更精确地说,这仍然不能完全“忽略空白”。单例空格,如
<book genre="no vel"/>
将被保留并具有相关性。如果您想完全忽略空格,可以使用
translate()
函数:string xpath = @"/bookstore/book [translate(@genre,' ','')='novel']";
关于c# - 使用SelectSingleNode和Xpath时忽略空白,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26715219/