Как заменить несколько тегов в строке на основе условий?

У меня есть файл XML, и мне нужно сделать некоторые замены перед основным процессом, поэтому я использую StringBuilder для чтения строки за строкой и внесения необходимых изменений. Один из них заключается в следующем:

Моя строка: <para>This<brk/>is<brk/>a<brk/>bold tag.</para> // Simple Input

Я разделяю каждую на новую строку. Таким образом, каждый будет:

<para>This</para> <para>is</para> <para>a</para> <para>bold tag.</para>

Теперь, если у меня есть тег <bold> или <italic> в теге <para>, то в идеале это должно быть: <para><bold>This<brk/>is<brk/>a<brk/>bold tag.</bold></para> // Main Input

Но в моем случае я должен разделить каждую на отдельные строки, так что это будет недопустимый синтаксис. По моему требованию должно быть: <para><bold>This</bold><brk/><bold>is</bold><brk/><bold>a</bold><brk/><bold>bold tag.</bold></para> // Required Input

Как проверить каждый тег <brk/>, чтобы убедиться, что каждый <brk/> заменен на <bold><brk/></bold>.

Дело в том, что теги <bold> могут находиться в любом месте строки. Например: <para><bold>This</bold> again<brk/> is<brk/><bold> a <brk/>paragraph</bold></para> // Another Input

Теперь, если я разделю это в соответствии с правилом разделения, которое я использую, оно станет: <para><bold>This</bold>again</para> <para>is</para> <para><bold>a</para> // Line 1 <para>bold tag.</bold></para> // Line 2

Line 1 и Line 2 являются недопустимыми строками XML.

В этом случае вывод будет: <para><bold>This</bold> again<brk/> is<brk/><bold> a </bold><brk/><bold>paragraph</bold></para>.

Если я не сделаю эту замену, XML будет недействительным, так как мне придется разбивать строку на новую строку в каждом теге <brk/>.

Если вы не работаете с дрянными сторонними интерфейсами, нет необходимости разделять узлы XML на разные строки. Классы, связанные с .NET XML, прекрасно работают без разрывов строк.

Cleptus 12.03.2019 13:23

На самом деле, я работаю над приложением, и это требование, поэтому я возьму файл XML в качестве входных данных и проверю несколько тегов. Затем я заменю их по мере необходимости. Это одно из требований.

Primo Chalice 12.03.2019 13:25

Помогает ли это? Я не уверен, понял ли ваш вопрос.

Diego Penha 12.03.2019 13:27

Почему вы не работаете с классами, связанными с XML? Эту <brk/> логику можно было бы довольно легко реализовать с помощью рекурсии и замены внутреннего текста XML-узла.

Cleptus 12.03.2019 13:28

@PrimoChalice Я бы дважды проверил ваши требования, потому что однострочный XML против хорошо отформатированного XML ... Это все еще действующий XML

Jamie Rees 12.03.2019 13:28

Diego Penha и bradbury9, я полагаю, что не могу правильно объяснить вопрос. Таким образом, в основном тег <bold> или <italic> может находиться в любом месте строки. Мне просто нужно проверить формат. Если не совпадает, то просто измените его, как указано в вопросе.

Primo Chalice 12.03.2019 13:31

Это похоже на то, что мне нужно проверить количество тегов <brk/> в строке, а затем теги <bold> или <italic>, как открывающие, так и закрывающие. Я должен убедиться, что если я разобью строку на несколько строк, XML не будет недействительным.

Primo Chalice 12.03.2019 13:33

Джейми Риз, на самом деле проблема в этом. Если тег открывается в строке 1 и закрывается в строке 2, он недействителен, верно? Это проблема, которую я хочу решить.

Primo Chalice 12.03.2019 13:34

@PrimoChalice - Нет. Вы можете открыть тег в первый раз и закрыть его в сотый, и он все еще будет действительным (конечно, это зависит от того, что такое XML ...). Кроме того, к вашему сведению, здесь вы можете отвечать конкретным пользователям с помощью «@» перед их именем.

Broots Waymb 12.03.2019 13:36

@BrootsWaymb - Извините, мой плохой. Кроме того, я получаю следующую ошибку: The 'bold' start tag on line 18 position 8 does not match the end tag of 'para'. Line 18, position 15.'<para><bold>This</bold> again</para> // Line 16 <para> is</para> // Line 17 <para><bold> a </para> // Line 18 <para>paragraph</bold></para> // Line 19

Primo Chalice 12.03.2019 13:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
139
2

Ответы 2

Не самое эффективное решение, которое вы там найдете, но вы можете попробовать:

string FormatLine(string xmlLine)
{
    var xmlBoldLine = GetFormattedString(xmlLine, "bold");
    var xmlitalicLine = GetFormattedString(xmlBoldLine, "italic");

    return xmlitalicLine;
}

string GetFormattedString(string xmlLine, string tag)
{
    if (xmlLine.Contains(tag))
    {
        return "<" + tag + ">" + xmlLine.Replace(tag, "") + "</" + tag + ">";
    }

    return xmlLine;
}

Вы не должны использовать строковый метод для изменения xml. Используйте одну из стандартных библиотек Net Xml, например Xml Linq, показанную ниже.

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;



namespace ConsoleApplication104
{
    class Program
    {


         static void Main(string[] args)
        {
            string xml = "<root><para>This<brk/>is<brk/>a<brk/>bold tag.</para></root>";

            XElement root = XElement.Parse(xml);

            XElement para = root.Element("para");

            List<XElement> children = para.Elements().ToList();
            foreach (XElement child in children)
            {
                root.Add(new XElement("para", child.NextNode.ToString()));
            }
             children.Remove();

        }
    }
}

Другие вопросы по теме