我正在将Value
元素<content>Text with <br /> break</content>
读入字符串并在TextBox
中显示该字符串。之后,用户可以使用其他HTML标记对其进行修改。使用linq查询确切的节点以插入用户输入所有尖刺括号&lt;&gt;来自html标签的规范化为<br />
。那么如何预先设置我的html标签呢?
我已阅读并尝试过这些问题的解决方案,但我未能将其应用于我的用例: c# XML avoid html encode using XDocument
Get html tags embedded in xml using linq
Keep HTML tags in XML using LINQ to XML
这是我的xml文件的一个示例:
<events>
<event id="0">
<content><br/></content>
</event>
</events>
我如何加载和查询:
XDocument xml;
XmlTextReader xtr = new XmlTextReader(this.pathXML);
xtr.Normalization = false;
xml = XDocument.Load(xtr, LoadOptions.PreserveWhitespace);
xtr.Close();
var nodeToEdit = xml.Descendants("event").Where(x => (string)x.Attribute("id") == "0");
我如何使用用户输入操作我的xml文件:
string userinput = "Text with <br /> break"; // This is read from TextBox control inside Form
foreach (var item in nodeToEdit.Elements())
{
if(item.Name == "content")
{
item.Value = userinput;
}
}
我如何保存:
changeSaveIndent(xml, this.pathXML);
public static void changeSaveIndent(XDocument x, string path)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
// Indent by tab. Can be changed to " " or similar
settings.IndentChars = "\t";
using (XmlWriter writer = XmlTextWriter.Create(path, settings))
{
x.Save(writer);
}
}
我期望的xml输出文件应如下所示:
<events>
<event id="0">
<content>Text with <br /> break</content>
</event>
</events>
对不起这篇长篇文章...
答案 0 :(得分:1)
替换它:
if(item.Name == "content")
{
item.Value = userinput;
}
用这个:
if(item.Name == "content")
{
item.ReplaceWith(XElement.Parse("<content>" + userinput + "</content>"));
}
请注意,您的用户输入必须是有效的XML才能生效。如果没有,你最好不要将对XElement.Parse的调用分解为try catch块,或者只是将输入添加为未转义的CDATA,如下所示:
if (item.Name == "content")
{
item.Value = "";
item.Add(new XCData(userinput));
}
哪个会产生如下所示的XML:
...
<content><![CDATA[Text with <br /> break]]></content>
...
答案 1 :(得分:0)
根据您所描述的内容,我会说您在XML文件中使用了错误的格式。 &LT峰; br /&GT;根本不是在XML文件中描述新节点,而是将其用作内容的一部分,因此应对其进行编码。但是,如果你必须像你描述的那样检索和设置内容节点,你需要.InnerXml
,而不是.Value
或.Text
或.InnerText