1

私が取り組んでいるアプリケーションに関して、XElement クラスに非常に具体的な問題があります。

要素の値を「test & testing more < >」に設定しようとするとします。

        XElement tester = updatedElement.XPathSelectElement("Test");
        tester.SetValue("test & testing more < >");

        // outputs
        //<Test>test &amp; testing more &lt; &gt;</Test>

それは正しくて問題ありませんが、使用しているアプリケーションの制限により、一重引用符と二重引用符もエンコードする必要があります。

XElement.SetText() を呼び出す前に、入力をクリーンアップするとします。

     XElement.SetText(stringValue.EscapeXml())

      public static string EscapeXml(this string s)
    {
        string xml = s;
        if (!string.IsNullOrEmpty(xml))
        {
            xml = xml.Replace("\"", "&quot;");
            xml = xml.Replace("'", "&apos;");
        }
        return xml;
    }

SetText関数が呼び出されると、&quot;に変わります。&amp;quot;そのため、HTML がレンダリングされると " のように見えますが、実際には " を表示したいのです。

単一引用符をエンコードする必要があるのは、実行時に xpath 式を作成するサービスがあるためです。

IE - サービスによって作成された xpath は

XElemenet test = testParent.XPathSelectElement("Test[.='some value with single quote's ']")

単一引用符は、xpath 式としてフィルターとして配置されると、例外を引き起こします。&apos;「フィルターを作成するときに一重引用符を置き換えることができないのはなぜですか」と言うかもしれません。

できない理由は、XML ノードと同じ値を持つフィルターに基づいて一致する ID 要素がいくつかあるためです。親にはフィルター処理された式に一致するものがないため、フィルターも要素を返しません。

XML の巨大なチャンクをサービスに渡し、サービスが渡した XML を別の形式の XML に変換するため、二重引用符が機能します。次に、サービスは XML を別のサービスに送信します。別のサービスは、多くの属性を持つ別のフォームを返します。

だから私は次のように送ったとしましょう:

<test>Some value from the original XML "123"<test/> // cannot encode here, must be done before hand

私は戻ってきます

<test value="Some value from the original XML "123""/>

二重引用符を渡すと、応答を評価するときに失敗します。属性の値は元の要素と正確に一致する必要があるため、サービスに送信する前に単純にエンコードすることはできません。

" および ' 引用符をエンコードする XElement クラスの拡張メソッドを持っている人はいますか。 SetText をオーバーライドしようとしましたが、うまくいきません。

この問題を解決するための助けをいただければ幸いです。

ありがとう!

4

1 に答える 1

2

&apos;XPath 1.0 では構文がエスケープされた単一引用符として理解されないため、XML 構文で引用符をエスケープすることが XPath 1.0 式でどのように役立つかわかりません。XPath 2.0 を使用しても、XPath 2.0 の構文規則に従って引用符をエスケープする必要があり、引用符を 2 倍にする必要がありますTest[.='some value with single quote''s ']

XDocument または XElement を保存し、単一引用符または二重引用符をエンティティ参照としてエスケープすることを強制する場合、正しい方法は、必要に応じて各引用符が確実にエスケープされる XmlWriter 実装を拡張することです。次に、カスタム XmlWriter 実装のインスタンスに保存します。

于 2012-04-27T09:48:41.023 に答える