2008-08-19 22 views
1

У меня есть простой CAML запрос каксодержимое тега Escaping XML

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

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

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

ответ

0

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

+0

Я работаю с NET 2.0 – axk 2008-09-16 10:05:10

0

Я не уверен, какой контекст XML исходит из, но если она хранится в переменной строка сопзЬ, которую вы создали, то самый простой способ изменить это будет:

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

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"; 
} 
+0

Кажется, что много кода для такой основной задачи. – axk 2008-09-16 10:06:34

1

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

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>"; 
1

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

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