Форматирование строки в формате XML и удаление недопустимых символов атрибута

У меня есть строка "<Node a="<b>">". Мне нужно экранировать только данные и проанализировать эту строку как узел в XMLWriter. Следовательно, как избежать только значения атрибута «‹» и отметить «‹» структуры XML.


person B V Raman    schedule 02.05.2016    source источник
comment
Что-то вроде <Node a="&lt;b&gt;">?   -  person yaakov    schedule 02.05.2016
comment
Разве это не происходит автоматически? Если вы используете свойство InnerText или Value, оно автоматически экранируется. Если вы получили эти данные от кого-то другого, скажите им, что их данные искажены и непригодны для использования.   -  person Manfred Radlwimmer    schedule 02.05.2016
comment
@codran да, мне нужно сделать что-то подобное для строки.   -  person B V Raman    schedule 03.05.2016
comment
@ManfredRadlwimmer Я не получаю доступ к этому из XMLNode, а вместо этого это строка   -  person B V Raman    schedule 03.05.2016


Ответы (1)


using (var writer = XmlWriter.Create(Console.Out))
{
    writer.WriteStartElement("Node");
    writer.WriteAttributeString("a", "<b>");
}

Выход <Node a="&lt;b&gt;" />


Во-первых, вы должны проанализировать строку. Поскольку это недопустимый xml, вы не можете использовать синтаксический анализатор xml. Вы можете попробовать HtmlAgilityPack. Затем вы можете записать значения с помощью средства записи xml.

string s = "<Node a=\"<b>\">";

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(s);

var node = doc.DocumentNode.FirstChild;
var attr = node.Attributes[0];

using (var writer = XmlWriter.Create(Console.Out))
{
    writer.WriteStartElement(node.Name);
    writer.WriteAttributeString(attr.Name, attr.Value);
}
person Alexander Petrov    schedule 02.05.2016
comment
Но я не знаю имени элемента, а оно само в строковой форме. Для экс. строка ‹Node a=‹b›› - person B V Raman; 03.05.2016
comment
Я думаю, что это сработает, но в случае нескольких атрибутов нам придется изменить логику. - person B V Raman; 09.05.2016