1

我在将一些字符串附加到某些 XML 节点时遇到问题。为了更好地解释这一点,我做了一个简单的例子......想象一下我有这个 XML 代码:

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

请注意,我明确使用&#39;的不是单引号字符,而是简单地写“Surfin' USA”。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() 并获取原始值,这正是您所期望的. 否则它会破坏合同。

但是,通过请求 OuterXml(返回标记)而不是获取 InnerText 值(返回存储的数据),您在转义序列上“减一”。您可以手动对数据运行取消转义或使用 .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 回答