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

#c# #.net #xml #linq

#c# #.net #xml #linq

Вопрос:

У меня есть XML-файл, и в нем содержится несколько <b> тегов. Есть определенные элементы, в которых мне не нужны теги, но мне нужно значение или его дочерние узлы.

Например:

 <p><b>This is a value</b></p>
<h2><b><i>This is another value</i></b></h2>
<h3><b>This is the last value</b></h3>
  

Здесь, поскольку <p> это круто, ничего не нужно удалять. Но для <h2> и <h3> я хочу <b> , чтобы теги были удалены. Итак, конечное значение будет:

 <p><b>This is a value</b></p>
<h2><i>This is another value</i></h2>
<h3>This is the last value</h3>
  

Я знаю, что могу удалить <b> тег, сохранить его значение в переменной и снова вставить его в элемент. Но есть ли какой-либо другой способ сделать это? Я ищу linq .

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

1. xmlContent.Replace("<b>", string.Empty).Replace("</b>", string.Empty) ?

2. это удалило бы все теги <b> / </b>, а не только то, что он запрашивает @vasily.sib

3. @Primo на какую логику вы надеетесь? правила, которые вы хотите определить, когда удалять тег, а когда сохранять, не ясны.

4. @DenisSchaf это всего лишь намек, а не ответ. Вы можете использовать xmlContent.Replace("<h2><b>", "<h2>").Replace("</b></h2>", "</h2>") тот же способ. Зависит от xmlContent разнообразия.

5. @DenisSchaf и @vasily.sib — Я хочу что-то вроде этого xdoc.Descendants().Where(el => el.Name == "h2" amp;amp; el.Elements("b").Count() > 0) //Remove the <b> tags but keep its value .

Ответ №1:

попробуйте использовать эту функцию:

     string RemoveTags(string file, string tagToRemove, string parentTag)
    {
        XDocument doc = XDocument.Parse(file);
        var remove = doc.Descendants().Where(el => el.Name == tagToRemove amp;amp; el.Parent.Name == parentTag);
        for (int i = 0; i < remove.Count(); i  )
        {
            remove.ElementAt(i).Parent.Value = remove.ElementAt(i).Value;
        }

        return doc.ToString();
    }
  

Он удалит все элементы с тегом tagToRemove , если их родителем является ParentTag`, сохраняя при этом их содержимое

Использование:

 RemoveTags(@"C:myFancyXMLDocument.txt", "b", "h2" });
  

Ввод:

 <?xml version="1.0" encoding="utf-8"?>
<frame>
  <p>
    <b>This is a value</b>
  </p>
  <h2>
    <b>
      <i>This is another value</i>
    </b>
  </h2>
  <h3>
    <b>This is the last value</b>
  </h3>
</frame>
  

Вывод:

 <?xml version="1.0" encoding="utf-8"?>
<frame>
  <p>
    <b>This is a value</b>
  </p>
  <h2>This is another value</h2>
  <h3>
    <b>This is the last value</b>
  </h3>
</frame>
  

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

1. Мое XML содержимое находится в строковой переменной, и это запрашивает файл, есть ли способ указать переменную и внести изменения? Я анализирую свою переменную xdoc = XDocument.Parse(filecontent, LoadOptions.PreserveWhitespace);

2. я отредактировал свой ответ, теперь он принимает строку с xml вместо пути

3. Это несколько помогло. Я не знаю почему, но он объединяет последний элемент со следующим. Я имею <p>This is<br/>a<br/>value.</p> в виду, и <p>This is another value.</p> становится <p>This is</p><p>a</p><p>value.This is another value.</p>