首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以让XmlSerializer在反序列化时忽略命名空间吗?

我可以让XmlSerializer在反序列化时忽略命名空间吗?
EN

Stack Overflow用户
提问于 2009-05-15 18:57:26
回答 6查看 72.3K关注 0票数 51

是否可以让XmlSerializer在反序列化时忽略名称空间(xmlns属性),这样无论是否添加属性,甚至属性是假的,都无关紧要?我知道源文件总是可信的,所以我不关心xmlns属性。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-16 20:47:53

可以,您可以告诉XmlSerializer在反序列化过程中忽略名称空间。

定义忽略命名空间的XmlTextReader。如下所示:

代码语言:javascript
复制
// helper class to ignore namespaces when de-serializing
public class NamespaceIgnorantXmlTextReader : XmlTextReader
{
    public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader): base(reader) { }

    public override string NamespaceURI
    {
        get { return ""; }
    }
}

// helper class to omit XML decl at start of document when serializing
public class XTWFND  : XmlTextWriter {
    public XTWFND (System.IO.TextWriter w) : base(w) { Formatting= System.Xml.Formatting.Indented;}
    public override void WriteStartDocument () { }
}

下面是如何使用TextReader反序列化示例:

代码语言:javascript
复制
public class MyType1 
{
    public string Label
    {
        set {  _Label= value; } 
        get { return _Label; } 
    }

    private int _Epoch;
    public int Epoch
    {
        set {  _Epoch= value; } 
        get { return _Epoch; } 
    }        
}



    String RawXml_WithNamespaces = @"
      <MyType1 xmlns='urn:booboo-dee-doo'>
        <Label>This document has namespaces on its elements</Label>
        <Epoch xmlns='urn:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>0</Epoch>
      </MyType1>";


    System.IO.StringReader sr;
    sr= new System.IO.StringReader(RawXml_WithNamespaces);
    var s1 = new XmlSerializer(typeof(MyType1));
    var o1= (MyType1) s1.Deserialize(new NamespaceIgnorantXmlTextReader(sr));
    System.Console.WriteLine("\n\nDe-serialized, then serialized again:\n");
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("urn", "booboo-dee-doo");
    s1.Serialize(new XTWFND(System.Console.Out), o1, ns);
    Console.WriteLine("\n\n");

结果是这样的:

代码语言:javascript
复制
    <MyType1>
      <Label>This document has namespaces on its elements</Label>
      <Epoch>0</Epoch>
    </MyType1>
票数 54
EN

Stack Overflow用户

发布于 2015-07-29 16:38:05

如果不需要命名空间,但输入具有命名空间,则可以设置

名称空间= false

在你的XmlTextReader上。

票数 31
EN

Stack Overflow用户

发布于 2017-03-22 19:58:45

扩展的Wolfgang答案(无异常处理):

代码语言:javascript
复制
public static Message Convert(XmlDocument doc)
{
    Message obj;
    using (TextReader textReader = new StringReader(doc.OuterXml))
    {
        using (XmlTextReader reader = new XmlTextReader(textReader))
        {
            reader.Namespaces = false;
            XmlSerializer serializer = new XmlSerializer(typeof(Message));
            obj = (Message)serializer.Deserialize(reader);
        }
    }

    return obj;
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/870293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档