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

本文关键字:amp 问题 节点 XmlText 转换 字符 | 更新日期: 2023-09-27 18:35:11

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

你能帮我解释一下我如何避免这种转换吗?
非常感谢您的时间和帮助

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

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

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

但是,通过请求 OuterXml(返回标记)而不是获取 InnerText 值(返回存储的数据),您在转义序列上"偏离了 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# 的使用,但这是我的手指键入的内容。