Предположим, что у нас есть следующий 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 файл и случайно помещает дополнительное пространство между словом "роман" и двойными кавычками, 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']";