xml反序列化能否忽略命名空间

plcly1 2017-02-23 05:04:03
如下代码会报错,xml由他人传输,所以不能指定命名空间,求解决方案

class Program
{
static void Main(string[] args)
{
string xml = "<aaa xmlns:i=\"123\" xmlns=\"123\"><a>a</a><b>b</b></aaa>";

var re=XmlToModel<aaa>(xml);

Console.ReadLine();
}
public static T XmlToModel<T>(string xml)
{
StringReader xmlReader = new StringReader(xml);
XmlSerializer xmlSer = new XmlSerializer(typeof(T));
return (T)xmlSer.Deserialize(xmlReader);
}
}
public class aaa
{
public string a { get; set; }
public string b { get; set; }
}
...全文
4823 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
一击光头 2019-09-09
  • 打赏
  • 举报
回复
引用 10 楼 plcly1 的回复:
 public static T XmlToModel<T>(string xml)
        {
            StringReader xmlReader = new StringReader(xml);
            XmlTextReader xr = new XmlTextReader(xmlReader);
            xr.Namespaces = false;
            XmlSerializer xmlSer = new XmlSerializer(typeof(T));
            return (T)xmlSer.Deserialize(xr);
        }
试了这个方法,我用不了,后来找了StackOverflow ,找到了方法: public class NamespaceIgnorantXmlTextReader : XmlTextReader { public NamespaceIgnorantXmlTextReader(System.IO.TextReader reader): base(reader) { } public override string NamespaceURI { get { return ""; } } }
plcly1 2017-03-02
  • 打赏
  • 举报
回复
 public static T XmlToModel<T>(string xml)
        {
            StringReader xmlReader = new StringReader(xml);
            XmlTextReader xr = new XmlTextReader(xmlReader);
            xr.Namespaces = false;
            XmlSerializer xmlSer = new XmlSerializer(typeof(T));
            return (T)xmlSer.Deserialize(xr);
        }
  • 打赏
  • 举报
回复
引用 6 楼 plcly1 的回复:
不同的人传的命名空间会不一样,看来只能让传送方去掉命名空间了
xml 本身就是以纠结命名空间为荣的。所以如果命名空间错了,你直接就可以拒绝服务。
  • 打赏
  • 举报
回复
引用 5 楼 plcly1 的回复:
感谢回复,应用场景为提供接口服务,交三方调用,三方需要传送一个序列化后的对象过来, 同时支持json和xml,但是三方传送了一个带命名空间的xml过来,无法解析。
xml 纠结命名空间,作为一个非常重要的东西,不嫌累赘地纠结命名空间。 因此“第三方”应该明确保证命名空间的准确(假设你的协议要求“没有”那么就应该没有,要求“有”那么就必须一致),其实才算是真正搞懂了你要求的协议。你所说的“第三方需要传送一个序列化.....但是三方传送了一个带命名......”这其实就是个无原则的话。 传送的 xml 文本,在 xmlreader 读取它的时候,你可以取消命名空间,也可以加入命名空间。不是不可以解析。只不过凡是这种东西你都需要这样做,那么这耗费了大量时间。
XBodhi. 2017-02-23
  • 打赏
  • 举报
回复
引用 6 楼 plcly1 的回复:
[quote=引用 4 楼 qiaohuyue 的回复:]
不同的人传的命名空间会不一样,看来只能让传送方去掉命名空间了[/quote] 如果是这样的话,就要你来固定这个协议了。总归是服务端来规划协议包。
plcly1 2017-02-23
  • 打赏
  • 举报
回复
引用 4 楼 qiaohuyue 的回复:
不同的人传的命名空间会不一样,看来只能让传送方去掉命名空间了
plcly1 2017-02-23
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
xml 是10年前时髦的东西。如果你要设计软件系统,请使用 json。
感谢回复,应用场景为提供接口服务,交三方调用,三方需要传送一个序列化后的对象过来, 同时支持json和xml,但是三方传送了一个带命名空间的xml过来,无法解析。
XBodhi. 2017-02-23
  • 打赏
  • 举报
回复
引用 3 楼 qiaohuyue 的回复:
不能,以前我遇到过,如果你在应用如下结构的时候需要加上,
[System.Xml.Serialization.XmlRoot(Namespace = "csofxml://Teacher.cs")]
class Teacher
{
    [System.Xml.Serialization.XmlElement]
    public string Name { get; set; }
    [System.Xml.Serialization.XmlArray("Students")]
    [System.Xml.Serialization.XmlArrayItem(Namespace = "csofxml://Student.cs")]
    public Student Students { get; set; }
}

[System.Xml.Serialization.XmlRoot(Namespace = "csofxml://Student.cs")]
class Student
{
    [System.Xml.Serialization.XmlElement]
    public string Name { get; set; }
}
否则会找不到的,tablenamespace 会出错。
抱歉遗漏了一个[]
[System.Xml.Serialization.XmlRoot(Namespace = "csofxml://Teacher.cs")]
class Teacher
{
    [System.Xml.Serialization.XmlElement]
    public string Name { get; set; }
    [System.Xml.Serialization.XmlArray("Students")]
    [System.Xml.Serialization.XmlArrayItem(Namespace = "csofxml://Student.cs")]
    public Student[] Students { get; set; }
}

[System.Xml.Serialization.XmlRoot(Namespace = "csofxml://Student.cs")]
class Student
{
    [System.Xml.Serialization.XmlElement]
    public string Name { get; set; }
}
XBodhi. 2017-02-23
  • 打赏
  • 举报
回复
不能,以前我遇到过,如果你在应用如下结构的时候需要加上,
[System.Xml.Serialization.XmlRoot(Namespace = "csofxml://Teacher.cs")]
class Teacher
{
    [System.Xml.Serialization.XmlElement]
    public string Name { get; set; }
    [System.Xml.Serialization.XmlArray("Students")]
    [System.Xml.Serialization.XmlArrayItem(Namespace = "csofxml://Student.cs")]
    public Student Students { get; set; }
}

[System.Xml.Serialization.XmlRoot(Namespace = "csofxml://Student.cs")]
class Student
{
    [System.Xml.Serialization.XmlElement]
    public string Name { get; set; }
}
否则会找不到的,tablenamespace 会出错。
  • 打赏
  • 举报
回复
xml 是10年前时髦的东西。如果你要设计软件系统,请使用 json。
  • 打赏
  • 举报
回复

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧