1

一部のXMLノードに一部の文字列をアタッチしているときに問題が発生しました。これをよりよく説明するために、私は簡単な例を作成しました...私がこのXMLコードを持っていると想像してください:

<song>
    <title>
        Surfin&#39; USA
    </title>
</song>

単に「Surfin'USA」と書く&#39;代わりに、一重引用符の代わりに明示的に使用していることに注意してください。XMLコードは有効です。または、少なくとも、オンラインで見つけてテストしたいくつかのツールによって有効であると見なされています。

私の問題は、その文字列をXmlTextオブジェクトに入れようとすると、次のようになることです。

Dim xmlDoc As New XmlDocument()
Dim xmlMyText As XmlText


xmlMyText = xmlDoc.CreateTextNode("Surfin&#39; USA")

XmlTextオブジェクト内にまったく同じ文字列値があると思いますが、代わりにわずかに異なる値を取得しています。

MsgBox(xmlMyText.OuterXml)  ' OUTPUTS: Surfin&amp;39; USA

&amp;つまり、 AFAIKが「アンパサンドをエスケープしないままにすることはできない」ため、アンパサンド記号はに変換されます。しかし、私の意見では、この場合、#39およびセミコロンと組み合わせて使用​​されるため、エスケープされていません。間違っていますか?

私を助けて、どうすればこの変換を回避できるか説明してもらえますか?
お手数をおかけしますが、よろしくお願いいたします。

4

1 に答える 1

1

送信したエスケープパスの数と、出力されるデータで使用しようとしているパスの数が一致しないことは、一般的な問題です。

ここで、OuterXmlは、設計されたとおりに実行しています。つまり、エスケープされた(保存されたXML)形式で提供されたデータを提供します。これは良いことです。このXMLを保存してからXMLドキュメントにロードし直すと、ノードに移動してノードで.InnerText()を要求し、元の値を取得できます。これは期待どおりです。 。そうしないと契約が破られます。

ただし、InnerText値(保存されたデータを返す)を取得する代わりにOuterXml(マークアップを返す)を要求することにより、エスケープシーケンスで「1つずつオフ」になります。データに対して手動でエスケープ解除を実行するか、.InnerText()を使用して自動的にソースデータに変換し直すことができます。

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Xml;       

namespace TestProject1
{
    [TestClass]
    public class UnitTest1
    {
        private const string testString = "Surfin&#39; USA";
        [TestMethod]
        public void TestMethod1()
        {
            XmlDocument xmlDoc = new XmlDocument();
            XmlText xmlMyText;

            xmlMyText = xmlDoc.CreateTextNode(testString);

            Assert.AreEqual(testString, xmlMyText.InnerText);

        }
    }
}

この単体テストは合格です。私のC#の使用を許してください、しかしそれは私の指がタイプするものです。

于 2012-05-23T16:26:08.583 に答える