转义XML标记内容

时间:2008-08-19 22:18:18

标签: .net xml frameworks escaping encode

我有一个简单的CAML查询,如

<Where><Eq><Field="FieldName"><Value Type="Text">Value text</Value></Field></Eq></Where>

我有一个变量来代替Value text。验证/转义.NET框架中替换的文本的最佳方法是什么? 我已经对这个问题进行了快速的网络搜索,但我发现的所有内容都是System.Xml.Convert类,但这似乎不是我在这里所需要的。

我知道我可以在这里使用XmlWriter,但对于这样一个简单的任务来说,似乎需要确保Value text部分的格式正确。

6 个答案:

答案 0 :(得分:1)

使用XML时,请始终使用适用于您的编程环境的XML API。不要尝试滚动自己的XML文档构建和转义代码。正如Longhorn213所提到的,在.Net中所有适当的东西都在System.XML命名空间中。试图编写自己的代码来编写XML文档只会导致许多错误和麻烦。

答案 1 :(得分:1)

在我的案例中,System.Xml方法的问题在于它需要太多代码来构建这个简单的XML片段。我想我已经找到了妥协方案。

XmlDocument doc = new XmlDocument();
doc.InnerXml = @"<Where><Eq><Field Name=""FieldName""><Value Type=""Text"">/Value></Field></Eq></Where>";
XmlNode valueNode = doc.SelectSingleNode("Where/Eq/Field/Value");
valueNode.InnerText = @"Text <>!$% value>";

答案 2 :(得分:1)

使用此:

System.Security.SecurityElement.Escape("<unescaped text>");

答案 3 :(得分:0)

使用System.Xml.Linq.XElementSetValue方法。这将格式化文本(假设字符串),但也允许您将xml设置为值。

答案 4 :(得分:0)

我不确定xml来自哪个上下文,但如果它存储在您创建的字符串const变量中,那么修改它的最简单方法是:

public class Example
{
    private const string CAMLQUERY = "<Where><Eq><Field=\"FieldName\"><Value Type=\"Text\">{0}</Value></Field></Eq></Where>";

    public string PrepareCamlQuery(string textValue)
    {
        return String.Format(CAMLQUERY, textValue);
    }
}

当然,这是基于这个问题的最简单的方法。您还可以将xml存储在xml文件中并将其读入并以此方式操作,就像Darren Kopp所回答的那样。这也需要C#3.0,我不确定您的目标是什么.Net Framework。如果您不是以.Net 3.5为目标而想要操作Xml,我建议您只使用带有C#的Xpath。这个reference详细介绍了使用xpath和C#来操作xml,而不是全部输入。

答案 5 :(得分:0)

您可以使用System.XML命名空间来执行此操作。当然你也可以使用LINQ。但我选择.NET 2.0方法,因为我不确定您使用的是哪个版本的.NET。

XmlDocument doc = new XmlDocument();

// Create the Where Node
XmlNode whereNode = doc.CreateNode(XmlNodeType.Element, "Where", string.Empty);
XmlNode eqNode = doc.CreateNode(XmlNodeType.Element, "Eq", string.Empty);
XmlNode fieldNode = doc.CreateNode(XmlNodeType.Element, "Field", string.Empty);

XmlAttribute newAttribute = doc.CreateAttribute("FieldName");
newAttribute.InnerText = "Name";
fieldNode.Attributes.Append(newAttribute);

XmlNode valueNode = doc.CreateNode(XmlNodeType.Element, "Value", string.Empty);

XmlAttribute valueAtt = doc.CreateAttribute("Type");
valueAtt.InnerText = "Text";
valueNode.Attributes.Append(valueAtt);

// Can set the text of the Node to anything.
valueNode.InnerText = "Value Text";

// Or you can use
//valueNode.InnerXml = "<aValid>SomeStuff</aValid>";

// Create the document
fieldNode.AppendChild(valueNode);
eqNode.AppendChild(fieldNode);
whereNode.AppendChild(eqNode);

doc.AppendChild(whereNode);

// Or you can use XQuery to Find the node and then change it

// Find the Where Node
XmlNode foundWhereNode = doc.SelectSingleNode("Where/Eq/Field/Value");

if (foundWhereNode != null)
{
    // Now you can set the Value
    foundWhereNode.InnerText = "Some Value Text";
}