Как получить определенный родительский элемент, когда установлено детское состояние

У меня возникают проблемы с написанием сценария C#, который даст мне определенный родительский элемент данного дочернего элемента. Чтобы прояснить ситуацию, это пример дерева XML.


  A
  
    B
    
      C
    
    D
  
  E
  

Traversing the tree, my script has found the node. What I'm trying to produce is the following tree.


  
    B
    
      C
    
    D
  
  

Как вы можете видеть, я пытаюсь удалить в исходном дереве child_element1 и child_element3 .

Я написал псевдокод для скрипта следующим образом, но до сих пор не удалось выяснить, как скриптировать реальную вещь в C #.

  1. Показать все первые и два родительских элемента выше ключевого узла. grandchild_element2 - первый родительский ключ, а child_element2 - второй родительский ключ. Таким образом, отображаются все их элементы.
  2. Показать только узел/элемент, который имеет непосредственную связь с ключом для следующего родительского уровня. parent является третьим родителем ключа. Элемент parent , который имеет прямую связь с ключом, это child_element2 . Таким образом отображается только child_element2 . child_Element1 и child_element2 не отображаются, поскольку они не имеют прямой связи с ключом

I've taken a look at the following solutions on stackoverflow, but unfortunately they all only show how to get all parent elements (instead of showing the ones which are ancestors of the node.

  1. Извлечь Атрибут родительского узла XML, если дочерний узел удовлетворяет определенным критериям и присваивает обе переменные
  2. C# XML, найти узел и всех его родителей
1
nl ja de
Итак, почему бы включить grandchild_element1 и grandchild_element3 ?
добавлено автор JLRishe, источник
Итак, почему бы включить grandchild_element1 и grandchild_element3 ?
добавлено автор JLRishe, источник
Итак, почему бы включить grandchild_element1 и grandchild_element3 ?
добавлено автор JLRishe, источник
Хорошо, что это, кажется, противоречит вашим описанным требованиям только о том, чтобы брать узлы, являющиеся родителями ключа, или родители этих родителей и так далее. Есть ли что-то в ваших описанных требованиях, которые я недопонимаю, или ваши требования неполны? В любом случае, не могли бы вы пояснить, почему следует включать grandchild_element1 и grandchild_element3 , а не child_element1 или child_element3 ), потому что Я не думаю, что это понятно.
добавлено автор JLRishe, источник
Хорошо, что это, кажется, противоречит вашим описанным требованиям только о том, чтобы брать узлы, являющиеся родителями ключа, или родители этих родителей и так далее. Есть ли что-то в ваших описанных требованиях, которые я недопонимаю, или ваши требования неполны? В любом случае, не могли бы вы пояснить, почему следует включать grandchild_element1 и grandchild_element3 , а не child_element1 или child_element3 ), потому что Я не думаю, что это понятно.
добавлено автор JLRishe, источник
Второй имеет grandchild_element1 и grandchild_element3 .
добавлено автор JLRishe, источник
Второй имеет grandchild_element1 и grandchild_element3 .
добавлено автор JLRishe, источник
Второй имеет grandchild_element1 и grandchild_element3 .
добавлено автор JLRishe, источник
У вас есть код, который вы уже установили, с которым мы можем работать?
добавлено автор Jon Egerton, источник
Его достаточно легко изолировать ключ , но исключить братьев и сестер родителей без использования грубой силы может быть интересно.
добавлено автор Jon Egerton, источник
Его достаточно легко изолировать ключ , но исключить братьев и сестер родителей без использования грубой силы может быть интересно.
добавлено автор Jon Egerton, источник
У вас есть код, который вы уже установили, с которым мы можем работать?
добавлено автор Jon Egerton, источник
@JRRishe Возможно, я не был ясен. Первый xml - это оригинал/источник, второй - результат, который я хочу
добавлено автор user2020692, источник
На самом деле grandchild_element2 содержит ключ, а другие grandchild_elements содержат данные. И это требование/формат поступает от третьей стороны. Иногда данные xml необходимо исправить. Третья сторона даст ключи, поэтому я могу исправить данные на основе ключей. В этом примере третье лицо дает мне ключ C. Поэтому мне нужно исправить данные grandchild_element1 или grandchild_element2 или обоих и отправить xml обратно, как второй XML
добавлено автор user2020692, источник
На самом деле grandchild_element2 содержит ключ, а другие grandchild_elements содержат данные. И это требование/формат поступает от третьей стороны. Иногда данные xml необходимо исправить. Третья сторона даст ключи, поэтому я могу исправить данные на основе ключей. В этом примере третье лицо дает мне ключ C. Поэтому мне нужно исправить данные grandchild_element1 или grandchild_element2 или обоих и отправить xml обратно, как второй XML
добавлено автор user2020692, источник
На самом деле grandchild_element2 содержит ключ, а другие grandchild_elements содержат данные. И это требование/формат поступает от третьей стороны. Иногда данные xml необходимо исправить. Третья сторона даст ключи, поэтому я могу исправить данные на основе ключей. В этом примере третье лицо дает мне ключ C. Поэтому мне нужно исправить данные grandchild_element1 или grandchild_element2 или обоих и отправить xml обратно, как второй XML
добавлено автор user2020692, источник
@JRRishe Возможно, я не был ясен. Первый xml - это оригинал/источник, второй - результат, который я хочу
добавлено автор user2020692, источник
@JRRishe Возможно, я не был ясен. Первый xml - это оригинал/источник, второй - результат, который я хочу
добавлено автор user2020692, источник

2 ответы

Это довольно просто, если вы используете XSLT:


  
  

  
    
  

  
    
      
      
    
  

Когда в примере xml предоставляется один корневой элемент и подается в этот XSLT, результатом является:


  
    
      
        C
      
    
  

Если вы не знакомы с XSLT, параметр XSLT:


по существу является переменной, значение которой вы можете передать из исполняемого кода. Здесь я только что присвоил ему значение по умолчанию C , поэтому его можно запустить в отладчике XSLT и получить убедительный результат.

1
добавлено
@ lazyberezovsky Да, это конечно будет. Этот LINQ получит список родительских элементов искомого значения, и они будут иметь все дочерние элементы, которые у них есть в исходном XML. Но если все, чего хочет искатель, это список родительских элементов искомого значения, то этого может быть достаточно. Если истинная цель искателя (так как это не на 100% ясно из вопроса) заключается в том, чтобы получить структуру xml со всеми остальными пропущенными, я предлагаю использовать его XSLT-решение, поскольку оно намного эффективнее и чище, чем ( насколько я знаю) все, что можно было бы написать на C #.
добавлено автор JLRishe, источник
Запрос LINQ вернет родителей со всеми остальными элементами
добавлено автор Sergey Berezovskiy, источник
Привет JLRishe и lazyberezovsky, я меняю пример. возможно, он может сделать 100% ясным :)
добавлено автор user2020692, источник

Это довольно просто, если вы используете XSLT:


  
  

  
    
  

  
    
      
      
    
  

Когда в примере xml предоставляется один корневой элемент и подается в этот XSLT, результатом является:


  
    
      
        C
      
    
  

Если вы не знакомы с XSLT, параметр XSLT:


по существу является переменной, значение которой вы можете передать из исполняемого кода. Здесь я только что присвоил ему значение по умолчанию C , поэтому его можно запустить в отладчике XSLT и получить убедительный результат.

1
добавлено
@ lazyberezovsky Да, это конечно будет. Этот LINQ получит список родительских элементов искомого значения, и они будут иметь все дочерние элементы, которые у них есть в исходном XML. Но если все, чего хочет искатель, это список родительских элементов искомого значения, то этого может быть достаточно. Если истинная цель искателя (так как это не на 100% ясно из вопроса) заключается в том, чтобы получить структуру xml со всеми остальными пропущенными, я предлагаю использовать его XSLT-решение, поскольку оно намного эффективнее и чище, чем ( насколько я знаю) все, что можно было бы написать на C #.
добавлено автор JLRishe, источник
Запрос LINQ вернет родителей со всеми остальными элементами
добавлено автор Sergey Berezovskiy, источник
Привет JLRishe и lazyberezovsky, я меняю пример. возможно, он может сделать 100% ясным :)
добавлено автор user2020692, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot