#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>