读取然后使用linq xml和xml writer将html写入xml文件

时间:2015-03-16 23:24:05

标签: c# html xml linq

我正在将Value元素<content>Text with <br /> break</content>读入字符串并在TextBox中显示该字符串。之后,用户可以使用其他HTML标记对其进行修改。使用linq查询确切的节点以插入用户输入所有尖刺括号&lt;&gt;来自html标签的规范化为&lt;br /&gt;。那么如何预先设置我的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

http://blogs.msdn.com/b/charlie/archive/2008/09/29/linq-farm-preserving-formats-with-linq-to-xml.aspx

这是我的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>

对不起这篇长篇文章...

2 个答案:

答案 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