Экранирование содержимого тегов XML - PullRequest
1 голос
/ 20 августа 2008

У меня простой CAML-запрос, такой как

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

И у меня есть переменная для замены Value text. Какой лучший способ проверить / скрыть текст, который подставляется здесь, в .NET Framework? Я выполнил быстрый поиск в Интернете по этой проблеме, но все, что я нашел, было System.Xml.Convert классом, но, похоже, это не совсем то, что мне нужно здесь.

Я знаю, что мог бы пойти с XmlWriter здесь, но мне кажется, что для такой простой задачи мне нужно много кода, и мне просто нужно убедиться, что часть Value text отформатирована правильно.

Ответы [ 6 ]

1 голос
/ 23 сентября 2009

Используйте это:

System.Security.SecurityElement.Escape("<unescaped text>");
1 голос
/ 25 августа 2008

Проблема с подходом 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>";
1 голос
/ 22 августа 2008

При работе с XML всегда используйте XML API, который работает в вашей среде программирования. Не пытайтесь свернуть свой собственный XML-документ, создающий и избегающий кода. Как упоминал Longhorn213, в .Net все соответствующие вещи находятся в пространстве имен System.XML Попытка написать собственный код для написания XML-документов просто приведет к множеству ошибок и неприятностей в будущем.

0 голосов
/ 22 августа 2008

Вы можете использовать пространство имен 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";
}
0 голосов
/ 20 августа 2008

Я не уверен, из какого контекста исходит 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, я рекомендую просто использовать Xpath с C #. Эта ссылка подробно описывает использование xpath с C # для манипулирования XML, а не то, что я печатал все это.

0 голосов
/ 20 августа 2008

используйте System.Xml.Linq.XElement и SetValue метод. Это отформатирует текст (при условии строки) , но также позволит вам установить xml как значение.

...