gpt4 book ai didi

c# - XML 属性未获取 namespace 前缀

转载 作者:数据小太阳 更新时间:2023-10-29 02:22:02 26 4
gpt4 key购买 nike

我需要在序列化期间生成以下 XML:(片段)

<IncidentEvent a:EventTypeText="Beginning" xmlns:a="http://foo">
<EventDate>2013-12-18</EventDate>
<EventTime>00:15:28</EventTime>
</IncidentEvent>

有问题的类如下所示:

public class IncidentEvent
{
public string EventDate { get; set; }
public string EventTime { get; set; }

[XmlAttribute("EventTypeText", Namespace = "http://foo")]
public string EventTypeText { get; set; }

}

序列化程序似乎注意到命名空间已经在 xmlns: 根目录中声明,并且忽略了我的属性。我还尝试了以下方法:

[XmlRoot(Namespace = "http://foo")]
public class IncidentEvent
{
public string EventDate { get; set; }
public string EventTime { get; set; }

private XmlSerializerNamespaces _Xmlns;

[XmlNamespaceDeclarations]
public XmlSerializerNamespaces Xmlns
{
get
{
if (_Xmlns == null)
{
_Xmlns = new XmlSerializerNamespaces();
_Xmlns.Add("ett", "http://foo");
}

return _Xmlns;
}

set
{
_Xmlns = value;
}
}


[XmlAttribute("EventTypeText", Namespace = "http://foo")]
public string EventTypeText { get; set; }

}

这会产生以下 XML:

  <ett:IncidentEvent EventTypeText="Beginning" xmlns:ett="http://foo">
<ett:EventDate>2013-12-18</ett:EventDate>
<ett:EventTime>00:15:28</ett:EventTime>
</ett:IncidentEvent>

这不是我想要的。元素不应该有前缀,属性应该有。需要什么才能让序列化程序理解我想要什么?

最佳答案

这可能是 XmlSerializer 中的错误。

正如您所注意到的,即使 XmlAttributeAttribute.Namespace明确设置,在某些情况下不会为该属性添加前缀。从测试来看,这似乎是在属性命名空间恰好与当前正在写入的元素的命名空间相同时发生的。

例如:

[XmlRoot(Namespace = "http://foo")]
public class IncidentEvent
{
[XmlAttribute("EventTypeText", Namespace = "http://foo")]
public string EventTypeText { get; set; }
}

序列化为以下 XML:

<q1:IncidentEvent EventTypeText="an attribute" xmlns:q1="http://foo" />

并且由于该属性没有前缀,它实际上不在任何命名空间中,如 in the XML standard 所解释的那样: 没有前缀的属性名称的命名空间名称始终没有值

但是,以下内容:

[XmlRoot(Namespace = "http://foo")]
public class IncidentEvent
{
[XmlAttribute("EventTypeText", Namespace = "http://bar")]
public string EventTypeText { get; set; }
}

使用正确前缀的属性进行序列化:

<q1:IncidentEvent p1:EventTypeText="an attribute" xmlns:p1="http://bar" xmlns:q1="http://foo" />

解决方法 是显式设置 [XmlAttribute(Form = XmlSchemaForm.Qualified)] .因此:

[XmlRoot(Namespace = "http://foo")]
public class IncidentEvent
{
[XmlAttribute("EventTypeText", Namespace = "http://foo", Form = XmlSchemaForm.Qualified)]
public string EventTypeText { get; set; }
}

序列化为

<q1:IncidentEvent q1:EventTypeText="an attribute" xmlns:q1="http://foo" />

根据需要。

关于c# - XML 属性未获取 namespace 前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20666023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com