Игнорировать пробелы при работе с SelectSingleNode и Xpath

1

Предположим, что у нас есть следующий 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");
  • 0
    Вам особенно нужно использовать XmlDocument и XPath? Я подозреваю, что это возможно, используя что-то вроде функции обрезки, но я бы лично рекомендовал вместо этого использовать LINQ to XML.
  • 0
    Дело не в спецификациях или чем-то еще, но это моя первая попытка работать с xpath, и в основном именно так мне удалось заставить его работать. Я уверен, что есть миллион лучших способов сделать это. Буду признателен за ссылку на пример.
Теги:
xpath

1 ответ

2
Лучший ответ

Используйте функцию normalize-space() XPath:

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

Это позволит обрезать любые ведущие или завершающие символы пробелов, но также нормализует любую последовательность пробельных символов между одним единственным пробелом.

Примечание. Чтобы быть более точным, это все еще не полностью "игнорирует пробелы". Синглтонские пробелы, как в

<book genre="no vel"/>

будут сохранены и актуальны. Если вы хотите полностью игнорировать пробелы, вы можете использовать функцию translate():

string xpath = @"/bookstore/book [translate(@genre,' ','')='novel']";
  • 0
    Это работает как шарм! Спасибо!
  • 0
    Нет, я хотел игнорировать лишние пробелы, а не устранять их полностью. Но спасибо за совет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню