XmlSerializer
を使用して、class
を.xml
ファイルに出力しています。ほとんどの場合、これは期待どおりに動作しています。しかし、要件として、特定の文字をデータの値から削除し、適切なエスケープ文字に置き換える必要があります。追加されたエスケープ文字をエスケープするXmlSerializer
値を置き換える必要がある要素では、Replace()
メソッドを使用して、更新された文字列を返します。下のコードはこの文字列置換を示しています。コメントされた行は、XmlSerializer
がすでにその特定の文字をエスケープしているためです。
私は、彼らはXML要素の値の範囲内に表示されたときに&
、<
、>
、'
、および"
文字をエスケープするには、サードパーティからの要求を持っています。現在、&
、<
、および>
の文字は、XmlSerializer
で適切にエスケープされています。これらの文字が存在する場合
エラーが受信される。
我々のシステムは、要求メッセージの添付ファイル内の潜在的な脅威を検出しました。
私は、文字列の置き換え行った後、XMLドキュメントをシリアル化するときしかし、XmlSerializer
は'
で&
文字を見て、それ&apos;
ます。私はこれがXmlSerializer
オブジェクトの正しい機能だと思います。しかし、私はシリアライザをにしたいと思います。はエスケープ文字を無視します。またはb)は、エスケープするために必要な他の文字をシリアル化します。
誰かが、具体的にどのようにこれらのいずれかを達成するためにいくつかの光を当てることができますか?
文字列置換法
public static string CheckValueOfProperty(string str)
{
string trimmedString = str.Trim();
if (string.IsNullOrEmpty(trimmedString))
return null;
else
{
// Commented out because the Serializer already transforms a '&' character into the appropriate escape character.
//trimmedString = trimmedString .Replace("&", "&");
//trimmedString = trimmedString.Replace("<", "<");
//trimmedString = trimmedString.Replace(">", ">");
trimmedString = trimmedString.Replace("'", "'");
trimmedString = trimmedString.Replace("\"", """);
return trimmedString;
}
}
のXmlSerializerコード
public static void SerializeAndOutput(object obj, string outputFilePath, XmlSerializerNamespaces ns = null)
{
XmlSerializer x = new XmlSerializer(obj.GetType());
// If the Output File already exists, delete it.
if (File.Exists(outputFilePath))
{
File.Delete(outputFilePath);
}
// Then, Create the Output File and Serialize the parameterized object as Xml to the Output File
using (TextWriter tw = File.CreateText(outputFilePath))
{
if (ns == null)
{
x.Serialize(tw, obj);
}
else { x.Serialize(tw, obj, ns); }
}
// =====================================================================
// The code below here is no longer needed, was used to force "utf-8" to
// UTF-8" to ensure the result was what was being expected.
// =====================================================================
// Create a new XmlDocument object, and load the contents of the OutputFile into the XmlDocument
// XmlDocument xdoc = new XmlDocument() { PreserveWhitespace = true };
// xdoc.Load(outputFilePath);
// Set the Encoding property of each XmlDeclaration in the document to "UTF-8";
// xdoc.ChildNodes.OfType<XmlDeclaration>().ToList().ForEach(d => d.Encoding = "UTF-8");
// Save the XmlDocument to the Output File Path.
// xdoc.Save(outputFilePath);
}
ただし、XML要素の実際の値の一部である場合、それらをエスケープする必要があります。これは要件です。 'XmlSerializer'は、値として現れたとき、自動的に'& '、'> '、' <'をエスケープしています。私はまた、一重引用符と二重引用符から逃げる必要があります。 – Russ
あなたの要件はどこから来ましたか? XML標準の要件ではありません。 – NineBerry
XMLを受け入れる第三者の要件です。彼らはこれらの文字をエスケープする必要があります。 – Russ