在XmlText节点中转换字符时出现问题(从'到&#39)

时间:2012-05-23 15:33:52

标签: c# xml vb.net

将某些字符串附加到某些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和分号一起使用,我错了吗?

你能帮我解释一下我怎么能避免这种转变? 非常感谢你的时间和帮助

1 个答案:

答案 0 :(得分:1)

在您发送的转义传递次数与您尝试使用的数据输出数量不匹配时,这是一个常见问题。

在这里,OuterXml正在完成它的设计目的:为您提供以转义(XML as stored)形式提供的数据。这是一件好事,因为如果您保存此XML然后将其加载回XML文档,您可以导航到节点并在节点上请求.InnerText()并获取原始值,这是您所期望的。否则就会违反合同。

但是,通过询问OuterXml(返回标记)而不是获取InnerText值(返回存储的数据),您在转义序列上“一个接一个”。您可以手动对数据运行unescaping或使用.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#,但这就是我的手指类型。