C # XmlNode имеет тип предка

#c# #xmldocument #xmlnode #ancestor

#c# #xmldocument #xmlnode #предок

Вопрос:

У меня есть XmlDocument в приведенном ниже формате. Если я выполню следующий поиск

 XmlNode title = xmlDoc.SelectNodes("//Book/Title[contains(., "Title3")]");
  

Я верну XmlNode, который является заголовком. Как мне узнать, подпадает ли эта книга под публикации? Я не всегда хочу использовать это название.Родительский узел.Родительский узел.Родительский узел существует. Должен быть интуитивно понятный способ сказать:

 if(title.hasAncestor("Publication") != null)
{
    // do whatever
}
  

Любая помощь будет высоко оценена

 <Publications>
    <Novel>
        <Book>
            <Title>Title1</Title>
            <Author>Author1</Author>
            <Year>2000</Year>
        </Book>
        <Book>
            <Title>Title2</Title>
            <Author>Author2</Author>
            <Year>2000</Year>
        </Book>
    </Novel>
    <History>
        <Book>
            <Title>Title3</Title>
            <Author>Author3</Author>
            <Year>2000</Year>
        </Book>
        <Book>
            <Title>Title4</Title>
            <Author>Author4</Author>
            <Year>2000</Year>
        </Book>
    </History>
</Publications>
<StudyGuides>
    <Math>
        <Book>
            <Title>Title5</Title>
            <Author>Author5</Author>
            <Year>2000</Year>
        </Book>
        <Book>
            <Title>Title6</Title>
            <Author>Author6</Author>
            <Year>2000</Year>
        </Book>
    </Math>
    <Science>
        <Book>
            <Title>Title7</Title>
            <Author>Author7</Author>
            <Year>2000</Year>
        </Book>
        <Book>
            <Title>Title8</Title>
            <Author>Author8</Author>
            <Year>2000</Year>
        </Book>
    </Science>
</StudyGuides>
  

Ответ №1:

Вы можете сделать это в XPath, используя ancestor ось:

 //Book/Title[contains(., "Title3")][ancestor::Publications]
  

Комментарии:

1. Спасибо за быстрый ответ. Я понимаю, что это даст мне все заголовочные узлы с внутренним текстом «Title3» в разделе Публикации. но что, если у меня есть XmlNode и что после этого определять, находится ли он в разделе публикации или в руководстве по изучению? Возможно, я неправильно смотрю на это? Возможно, мне нужно посмотреть, является ли узел дочерним узлом в разделе «Публикации» в XmlDocument?

2. @Koenyn Если у вас есть Title узел в качестве XmlNode , тогда используйте XmlNode.ParentNode рекурсивно или titleNode.SelectSingleNode(".[ancestor::Publications]") == null .

3. 🙂 спасибо. Действительно ценю это. Мне пришлось изменить его на titleNode. SelectSingleNode(«предок::Публикации») == null

Ответ №2:

 /Publications/*/Book/Title[contains(., 'Title3')]