序列化时带有特殊字符的 XML 元素名称

Posted

技术标签:

【中文标题】序列化时带有特殊字符的 XML 元素名称【英文标题】:XML element name with special characters while serialising 【发布时间】:2021-10-20 16:27:20 【问题描述】:

在将对象序列化为 XML 时,我使用像 [XmlElement("MyData:Pool1")] 这样的属性约定,它可以完成这项工作,但 XML 看起来像

<_x005C_MyData_x003A_Pool1 >

我认为它转换为冒号或任何特殊字符转换为其他格式,我尝试在字符串前面使用反斜杠、@ 和 $ 符号进行更改,但它没有帮助我。

除了使用字符串/正则表达式替换之外还有什么建议吗?

  private void Serlise(Interface request)
    
        var xsSubmit = new XmlSerializer(typeof(Interface));
        var ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        var xml = "";

        using (var encoder = new CustomEncoder())
        
            using (var  writer = XmlWriter.Create(encoder))
            
                xsSubmit.Serialize(writer, request,ns);
                xml = encoder.ToString();
            
        
        File.WriteAllText(@"output.xml", xml);
    

下面是要序列化的类


[System.SerializableAttribute()]

[System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.foo1.com/bar/test/")] [System.Xml.Serialization.XmlRootAttribute(ElementName = "Pool", Namespace = "http://www.foo1.com/bar/test/", IsNullable = false)] 公共部分类根

private Tester adminField;

private string versionField;

[XmlElement("Test:Pool1")]
public Tester Admin

    get
    
        return this.adminField;
    
    set
    
        this.adminField = value;
    


 
[System.Xml.Serialization.XmlAttributeAttribute()]
public string Version

    get
    
        return this.versionField;
    
    set
    
        this.versionField = value;
    

注意:由于保密协议,XML 上的命名空间和类名略有调整

<?xml version="1.0" encoding="utf-8"?><q1:MydataPool Version="1" xmlns:q1="http://www.foo1.com/bar/test"><q1:Data Id ="000123" Function="Hi"><q1:Hello Test="Abcd"  /></q1:Data></q1:MydataPool>

【问题讨论】:

_x005C_MyData_x003A_Pool1 是一个有效的 XML 名称。看看here at the W3 specs。在那里,您将看到 XML 名称 可以(仅)以 NameStartChar 开头,例如 ":" | [A-Z] | "_" | [a-z] | ...,然后是附加的 NameStartChars 和 NameChars,例如 @987654330 @. 这是从包含元素名称中不允许的字符的字符串生成有效元素名称的通用约定。你到底有什么问题?这并不漂亮,但它是绕过限制的明智方法。 或许您应该使用带有 MyData 前缀的命名空间? @AlexanderPetrov,我尝试使用命名空间但没有运气。 @MichaelKay,我真正的问题是 API 正在验证我传递给它的 XML 块的类型。它主动拒绝带有奇怪字符的字符,例如 x003A 。因为我无法控制 API,所以我不得不遵守他们的约定。 【参考方案1】:

在property属性中指定命名空间:

[XmlElement("Pool1", Namespace = "url")]
public Tester Admin

为此命名空间设置前缀:

var ns = new XmlSerializerNamespaces();
ns.Add("MyData", "url");

在结果中,你会得到

<MyData:Pool1>

【讨论】:

以上是关于序列化时带有特殊字符的 XML 元素名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在Objective C中使用XML解析发布带有特殊字符和泰语的字符串?

当属性名称包含特殊字符时,使用 xslt 转换 xml 结果后,输出未以 HTML 格式显示

如何在 Document.createElement() 中使用特殊字符 - VBA DOM XML

使用 PDO 插入带有特殊字符的值

使用特殊字符反序列化 XML 的快速方法

为啥html,xml的特殊符号转义不用斜杠,而要用& quot ;这样的奇怪形式?