Экранирование содержимого тегов XML

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

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

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

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

19.08.2008 22:18:17
6 ОТВЕТОВ

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

0
22.09.2015 15:43:32

Я не уверен, из какого контекста исходит 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, а не все это.

0
23.05.2017 10:27:42

Для этого вы можете использовать пространство имен 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
31.08.2015 17:35:59

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

1
22.08.2008 13:14:14

Проблема с подходом 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
25.08.2008 15:13:16

Использовать это:

System.Security.SecurityElement.Escape("<unescaped text>");
1
22.09.2015 15:41:44