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

Not*_*Dan 40 .net c# serialization xml-serialization

我是否可以在反序列化时使XmlSerializer忽略名称空间(xmlns属性),以便无论是否添加属性,或者即使属性是伪造的也无关紧要?我知道源始终是可信的,所以我不关心xmlns属性.

Che*_*eso 46

是的,您可以告诉XmlSerializer在反序列化期间忽略名称空间.

定义忽略名称空间的XmlTextReader.像这样:

// 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 () { }
}
Run Code Online (Sandbox Code Playgroud)

这是一个如何使用TextReader反序列化的示例:

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 o1= (MyType1) s1.Deserialize(new NamespaceIgnorantXmlTextReader(sr));
    System.Console.WriteLine("\n\nDe-serialized, then serialized again:\n");
    s1.Serialize(new XTWFND(System.Console.Out), o1, ns);
    Console.WriteLine("\n\n");
Run Code Online (Sandbox Code Playgroud)

结果如下:

    <MyType1>
      <Label>This document has namespaces on its elements</Label>
      <Epoch>0</Epoch>
    </MyType1>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是我的意思。您不是在告诉 XmlSerializer 忽略命名空间 - 您给它的 XML 没有命名空间。 (2认同)
  • ??? 我不明白.我给了它在元素上有名称空间的XML.代码反序列化(读取)XML文档并忽略命名空间. (2认同)

小智 24

如果您期望没有命名空间,但输入有命名空间,那么您可以设置

Namespaces = false

在您的XmlTextReader上.


klm*_*lm_ 11

夸张的Wolfgang Grinfeld回答(没有异常处理):

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;
}
Run Code Online (Sandbox Code Playgroud)

  • reader.Namespaces = false; 绝招。非常感谢 (2认同)