1

次のような単純なCAMLクエリがあります

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

そして、 を代用する変数がありますValue text。ここで .NET フレームワークで置換されたテキストを検証/エスケープする最良の方法は何ですか? この問題について簡単な Web 検索を行いましたが、見つかったのはSystem.Xml.Convertクラスだけでしたが、これは私がここで必要としているものではないようです。

hereを使用することもできたのはわかっていますが、パーツが適切にフォーマットさXmlWriterれていることを確認する必要があるだけの単純なタスクには、大量のコードのように思えます。Value text

4

6 に答える 6

1

これを使って:

System.Security.SecurityElement.Escape("<unescaped text>");
于 2009-09-23T14:16:43.330 に答える
1

XML を操作するときは、プログラミング環境で動作する XML API を常に使用してください。独自の XML ドキュメント構築およびエスケープ コードを作成しようとしないでください。Longhorn213 が述べたように、.Net では、適切なものはすべて System.XML 名前空間にあります。XML 文書を作成するために独自のコードを作成しようとしても、多くのバグやトラブルが発生するだけです。

于 2008-08-22T13:14:14.987 に答える
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>";
于 2008-08-25T15:13:16.233 に答える
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);
    }
}

もちろん、これは質問に基づく最も簡単なアプローチです。Darren Koppが答えたように、xmlをxmlファイルに保存し、それを読み込んで操作することもできます。これには C# 3.0 も必要ですが、どの .Net Framework をターゲットにしているのかわかりません。.Net 3.5 を対象としておらず、Xml を操作したい場合は、C# で Xpath を使用することをお勧めします。このリファレンスでは、C# で xpath を使用して xml を操作する方法について詳しく説明しています。

于 2008-08-19T22:52:38.940 に答える
0

System.XML 名前空間を使用してそれを行うことができます。もちろんLINQも使えます。ただし、使用している .NET のバージョンがわからないため、.NET 2.0 アプローチを選択します。

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";
}
于 2008-08-22T13:10:18.537 に答える
0

使い方System.Xml.Linq.XElementSetValue方法。これにより、テキストがフォーマットされます(文字列を想定)が、xml を値として設定することもできます。

于 2008-08-19T22:20:47.520 に答える