【问题标题】:removing namespace tag (xmlns:) from XMLSerializer从 XMLSerializer 中删除命名空间标记 (xmlns:)
【发布时间】:2012-01-25 21:42:44
【问题描述】:

我想在我的 C# 代码中生成以下 xml 输出:

<?xml version="1.0" encoding="utf-16"?>
<CallConnectReq Xmlns="urn:interno-com:ns:a9c" reqId="9" msgNb="2">
  <LocalCallId>0</LocalCallId>
</CallConnectReq>

现在我的实现方式如下:

var xnameSpace = new XmlSerializerNamespaces();
                xnameSpace.Add("Xmlns", Constants.XmlNameSpaceValue);
                var xmlSerializer = new XmlSerializer(objToSerialize.GetType());
                var stringWriter = new StringWriter();
                xmlSerializer.Serialize(stringWriter, objToSerialize, xnameSpace);
                return stringWriter.ToString().**Replace("xmlns:","");**

但我想在不使用 Replace() 方法的情况下 删除 "xmlns:" 标记。 有什么办法吗?

【问题讨论】:

  • @deathrace - 类型是什么样的,当前的 xml 是什么样的?
  • @jgauffin(我之前的评论不正确,顺便说一句)——它肯定是 相关的,但获取默认命名空间的语法略有不同,需要对类型定义 - 足以分开,IMO
  • @deathrace 你真的不想要Xmlns="...",原因很简单,不是有效的命名空间限定符;它必须xmlns="..."
  • 如果我删除 .Replace() 方法,它会给出:

标签: c# xml xml-serialization


【解决方案1】:

如果您真正想要Xmlns(重申一下,我坚信这是xmlns 的错字,如果不是:这是一个糟糕的选择,因为它会增加混乱),然后:

var xnameSpace = new XmlSerializerNamespaces();
xnameSpace.Add("", "");
var ser = new XmlSerializer(typeof (CallConnectRequest));
ser.Serialize(destination, new CallConnectRequest {
    RequestId = 9,
    MessageNumber = 2,
    LocalCallId = 0
}, xnameSpace);

使用:

[XmlRoot("CallConnectReq")]
public class CallConnectRequest {
    [XmlAttribute("Xmlns"), Browsable(false)]
    [EditorBrowsable(EditorBrowsableState.Never)]
    public string XmlNamespace {
        get { return "urn:interno-com:ns:a9c";} set { }
    }
    [XmlAttribute("reqId")]
    public int RequestId { get; set; }
    [XmlAttribute("msbNb")]
    public int MessageNumber { get; set; }

    [XmlElement("LocalCallId")]
    public int LocalCallId { get; set; }
}

其中写道:

<?xml version="1.0" encoding="ibm850"?>
<CallConnectReq Xmlns="urn:interno-com:ns:a9c" reqId="9" msbNb="2">
  <LocalCallId>0</LocalCallId>
</CallConnectReq>

【讨论】:

    【解决方案2】:

    添加只是默认命名空间:

    var xnameSpace = new XmlSerializerNamespaces();
    xnameSpace.Add("", "urn:interno-com:ns:a9c");
    var ser = new XmlSerializer(typeof (CallConnectRequest));
    ser.Serialize(destination, new CallConnectRequest(), xnameSpace);
    

    与:

    [XmlRoot("CallConnectReq", Namespace = "urn:interno-com:ns:a9c")]
    public class CallConnectRequest {}
    

    【讨论】:

    • 仍然给出以下输出: 0 我想从中删除 'xmlns:'。
    • @deathrace 然后您误用了更改;你不应该在xnameSpace.Add 中有"Xmlns"。看起来你有:xnameSpace.Add("Xmlns", "urn:blah") - 但这不是我在回答中提出的
    • 哦,我错了。那工作得很好。实际上的问题是我使用的是 XmlType 而不是 XmlRoot。非常感谢。
    • 又是一个问题。在每个节点添加 q1:
    • @deathrace.dj 你的命名空间中有额外的引号...我猜你有XmlRoot(..., Namespace="xmlns=\"blah\"") - 再次,请与我在示例中的内容进行比较; 只是命名空间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 2010-10-20
    • 2011-11-27
    • 2011-08-08
    相关资源
    最近更新 更多