У меня есть простой запрос CAML, как
<Where><Eq><Field="FieldName"><Value Type="Text">Value text</Value></Field></Eq></Where>
И у меня есть переменная для замены Value text
. Какой лучший способ проверить / скрыть текст, который подставляется здесь, в .NET Framework? Я сделал быстрый поиск в Интернете по этой проблеме, но все, что я нашел, было System.Xml.Convert
классным, но это, кажется, не совсем то, что мне нужно здесь.
Я знаю, что мог бы использовать XmlWriter
здесь, но мне кажется, что для такой простой задачи мне нужно много кода, и мне просто нужно убедиться, что Value text
часть отформатирована правильно.
использование System.Xml.Linq.XElement
и SetValue
метод. Это отформатирует текст (предполагая строку) , но также позволит вам установить xml в качестве значения.
Я не уверен, из какого контекста исходит 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-файле, читать его и манипулировать им таким образом, как ответил Даррен Копп . Это также требует C # 3.0, и я не уверен, на какой .Net Framework вы ориентируетесь. Если вы не ориентируетесь на .Net 3.5 и хотите манипулировать Xml, я рекомендую просто использовать Xpath с C #. Эта ссылка подробно описывает использование xpath с C # для манипулирования xml, а не все это.
Для этого вы можете использовать пространство имен 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";
}
При работе с XML всегда используйте XML API, который работает в вашей среде программирования. Не пытайтесь свернуть свой собственный XML-документ, создающий и избегающий кода. Как упоминал Longhorn213, в .Net все соответствующие вещи находятся в пространстве имен System.XML. Попытка написать собственный код для написания XML-документов приведет к множеству ошибок и неприятностей в будущем.
Проблема с подходом 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>";
Использовать это:
System.Security.SecurityElement.Escape("<unescaped text>");