У меня есть файл 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 в качестве входных данных и проверю несколько тегов. Затем я заменю их по мере необходимости. Это одно из требований.
Помогает ли это? Я не уверен, понял ли ваш вопрос.
Почему вы не работаете с классами, связанными с XML? Эту <brk/>
логику можно было бы довольно легко реализовать с помощью рекурсии и замены внутреннего текста XML-узла.
@PrimoChalice Я бы дважды проверил ваши требования, потому что однострочный XML против хорошо отформатированного XML ... Это все еще действующий XML
Diego Penha и bradbury9, я полагаю, что не могу правильно объяснить вопрос. Таким образом, в основном тег <bold>
или <italic>
может находиться в любом месте строки. Мне просто нужно проверить формат. Если не совпадает, то просто измените его, как указано в вопросе.
Это похоже на то, что мне нужно проверить количество тегов <brk/>
в строке, а затем теги <bold>
или <italic>
, как открывающие, так и закрывающие. Я должен убедиться, что если я разобью строку на несколько строк, XML не будет недействительным.
Джейми Риз, на самом деле проблема в этом. Если тег открывается в строке 1 и закрывается в строке 2, он недействителен, верно? Это проблема, которую я хочу решить.
@PrimoChalice - Нет. Вы можете открыть тег в первый раз и закрыть его в сотый, и он все еще будет действительным (конечно, это зависит от того, что такое XML ...). Кроме того, к вашему сведению, здесь вы можете отвечать конкретным пользователям с помощью «@» перед их именем.
@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
Не самое эффективное решение, которое вы там найдете, но вы можете попробовать:
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();
}
}
}
Если вы не работаете с дрянными сторонними интерфейсами, нет необходимости разделять узлы XML на разные строки. Классы, связанные с .NET XML, прекрасно работают без разрывов строк.