Сохранение специальных символов в XML
-
08-10-2019 - |
Вопрос
У меня String XML хранится в таблице БД с символами подачи линий. В моей программе C # 3.5 я загружаю и манипулирую его с помощью Linq к XML, а затем показать его как строку в управлении текстовым ящиком в форме UI.
Мне нужно отступить для этого XML, а также сохранить линии подачи / возврата каретки, пока она показывая ее в интерфейсе UI.
Могу отступить это, но как мне сохранить LF / CR Chars в XML ??
Вот образец C # код:
XElement rootNode = CreateRootNode();
XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars);
rootNode.Add(testXmlNode );
var builder = new StringBuilder();
var settings = new XmlWriterSettings()
{
Indent = true
};
using (var writer = XmlWriter.Create(builder, settings))
{
rootNode.WriteTo(writer);
}
xmlString = builder.ToString();
xmlString = xmlString.Replace("
", Environment.NewLine); //Doesnt work
xmlString = xmlString.Replace("
", Environment.NewLine); //Doesnt work
//Heres how the xml should look like in the UI control:
<TestNode
name="xyz"
Id="12">
<Children>
<Child name="abc" location="p" />
</Children>
</TestNode>
Решение
То, что вы хотите сделать, это установить настройки форматирования на XMLerier, поэтому измените вашу строку:
var settings = new XmlWriterSettings()
{
Indent = true
};
К чему-то вроде это:
var settings = new XmlWriterSettings()
{
Indent = true,
IndentChars = "\n",
NewLineOnAttributes = true
};
Другие советы
Спасибо всем за ваши ответы. Наконец, я мог бы получить эту работу.
Мой подход не использует linq2xml / sax parser.am, генерируя XML, используя StringBuilder и показывать его в UI в управлении WinForms Rich TextBox. Теперь я могу видеть линейные каналы, как он находится в пользовательском интерфейсе.
В любое время вы преобразуете документ XML в строку и начните манипулировать строкой, вы должны подумать себе, «Я, я делаю что-то не так». Я не уверен от вашего описания, если это правда, но держу пари.
Если пробел в XML вы тянете из базы данных, важно, вы хотите сохранить его, когда вы проаналируете его в свой XElement
. Отказ Для этого используйте перегрузку XElement.Parse
Это делает это, например:
XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars, LoadOptions.PreserveWhitespace);
Когда вы делаете это, парсер оставит пробел в анализе XElement
Текстовые узлы документа именно там, где они были в исходной строке. XmlWriter
Не связывается с существующим пробелом в текстовых узлах (хотя он добавит новый пробел, если вы скажете это отступлению), так что это должно получить то, что вы хотите.
Вы можете использовать XMLReader, чтобы сохранить новые строки и все .. Вот пример код, который работал нормально для меня при тестировании:
System.Xml.XmlReader reader = System.Xml.XmlReader.Create("XML URI here");
System.Text.StringBuilder sb = new System.Text.StringBuilder();
while (reader.Read())
{
sb.Append(reader.ReadOuterXml());
}
reader.Close();
txtXML.InnerText = sb.ToString();
txtXML.Visible = true;
В моем тесте i загрузил файл XML, вы можете загрузить свою манипулировать XML String.
Вы пытались убедиться, что текстовое поле находится в многослойном режиме и принимает возврат каретки?
public void CreateMyMultilineTextBox() {
// Create an instance of a TextBox control.
TextBox textBox1 = new TextBox();
// Set the Multiline property to true.
textBox1.Multiline = true;
// Add vertical scroll bars to the TextBox control.
textBox1.ScrollBars = ScrollBars.Vertical;
// Allow the RETURN key to be entered in the TextBox control.
textBox1.AcceptsReturn = true;
// Allow the TAB key to be entered in the TextBox control.
textBox1.AcceptsTab = true;
// Set WordWrap to true to allow text to wrap to the next line.
textBox1.WordWrap = true;
// Set the default text of the control.
textBox1.Text = "Welcome!";
}