XML元素序列化过程中冒号字符被编码为x003A。

9

我已经定义了一个类型为Example的对象如下所示,实例化并使用XmlSerializer进行序列化后,我得到的是x003A而不是冒号 :

这是我的代码:

 public class Example
        {
            [XmlElement("Node1")]
            public string Node1 { get; set; }
            [XmlElement("rd:Node2")]
            public string Node2 { get; set; }
        }

序列化代码

 Example example = new Example { Node1 = "value1", Node2 = "value2" };

            XmlSerializerNamespaces namespaceSerializer = new XmlSerializerNamespaces(); 
            namespaceSerializer.Add("rd", @"http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
            System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Example));
            string path = System.Windows.Forms.Application.StartupPath + "//example.xml";
            using (StreamWriter writer = new StreamWriter(path))
            {
                serializer.Serialize(writer, example, namespaceSerializer);
            }

预期结果

<?xml version="1.0" encoding="utf-8"?>
<Example xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Node1>value1</Node1>
  <rd:Node2>value2</rd:Node2>
</Example>

实际结果:

<?xml version="1.0" encoding="utf-8"?>
<Example xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Node1>value1</Node1>
  <rd_x003A_Node2>value2</rd_x003A_Node2>
</Example>

任何在这方面的帮助和指导都将不胜感激。提前感谢!

1
因为rd:会被解释为XML命名空间。你期望的结果是无效的XML,因为该命名空间未定义。 - Lucas Trzesniewski
我已经使用XmlSerializerNamespaces为rd定义了命名空间 @LucasTrzesniewski - ANR Upgraded Version
2个回答

10

您需要这样做:

public class Example {
    [XmlElement("Node1")]
    public string Node1 { get; set; }
    // define namespace like this, not with a prefix
    [XmlElement("Node2", Namespace = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner")]
    public string Node2 { get; set; }
}

然后在序列化时:

var serializer = new XmlSerializer(typeof(Example));
var ns = new XmlSerializerNamespaces();
// map prefix to namespace like this
ns.Add("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
var ms = new MemoryStream();      
// use namespaces while serializing
serializer.Serialize(ms, new Example {
    Node1 = "node1",
    Node2 = "node2"
}, ns);

1
我已经做了同样的事情,但没有用。如评论中所提到的,我已为rd定义了命名空间。让我编辑帖子并添加有关我尝试过的更多信息的Serailization部分。 - ANR Upgraded Version
1
在发布之前,我进行了测试并且得到了预期的结果(好吧,不完全是预期的结果,因为您的预期结果是无效的 XML,而这个代码生成了有效的 XML)。请注意,我更改了您的 Node2 属性上的属性。 - Evk
我没有注意到你把 XmlElement("rd:Node2") 改成了 XmlElement("Node2"),现在它可以正常工作了,谢谢你,我很感激你的帮助。 - ANR Upgraded Version
@MaxPower 在什么意义上是“有效”的? - Evk
1
@MaxPower 简而言之 - 它们被视为唯一标识符(因此,只是字符字符串),不需要解析任何内容。一些 XML 解析器甚至不介意命名空间根本不是 URL。规范为什么将 URL 用作这种标识符是一个复杂的问题,许多人认为这是一个坏主意(我也这样认为),但既然有了规范,我们最好遵循它。请注意,由于上述原因 - 如果两个解析为同一文档的 URL 不同(即使只是大小写不同),它们仍将表示不同的命名空间。 - Evk
显示剩余2条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接