在具有命名空间前缀的元素内创建不带命名空间前缀的 XML 元素
Create XML element without namespace prefix inside element with namespace prefix
使用 XmlSerializer class 我想实现以下结果 XML:
<n:root xmlns:n="http://foo.bar">
<child/>
</n:root>
注意根定义了命名空间和前缀,但子没有。我设法使用以下 XSLT 做到了这一点:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:element name="n:root" xmlns:n="http://foo.bar">
<xsl:element name="child" />
</xsl:element >
</xsl:template>
</xsl:stylesheet>
...但是我想在 classes 上使用 .NET XmlSerializer 和 System.Xml.Serialization 属性。我创建了以下两个 classes:
[XmlRoot(ElementName = "root", ElementNamespace = "http://foo.bar")]
public class Root
{
[XmlElement(ElementName = "child")]
public Child Child { get; set; }
}
public class Child {}
然后我尝试将命名空间添加到 XmlSerializer 并使用 XmlSerializerNamespaces class:
对其进行序列化
public string Foo()
{
var root = new Root { Child = new Child() };
var ns = new XmlSerializerNamespaces();
ns.Add("n", "http://foo.bar");
var s = new XmlSerializer(typeof(Root));
var sb = new StringBuilder();
var xml = XmlWriter.Create(sb);
s.Serialize(xml, root, ns);
return sb.ToString();
}
不过方法returns下面XML:
<n:root xmlns:n="http://foo.bar">
<n:child/>
</n:root>
如何让XmlSerializer避免给内部元素添加命名空间前缀?
inb4: 我知道子元素没有其父元素的名称空间看起来很奇怪,但这是我从客户端收到的消息的形状,我需要创建模拟相同行为的模拟 Web 服务。
像这样改变你的 Root
class 应该可以做到:
[XmlRoot(ElementName = "root", Namespace = "http://foo.bar")]
public class Root
{
// note empty namespace here
[XmlElement(ElementName = "child", Namespace = "")]
public Child Child { get; set; }
}
使用 XmlSerializer class 我想实现以下结果 XML:
<n:root xmlns:n="http://foo.bar">
<child/>
</n:root>
注意根定义了命名空间和前缀,但子没有。我设法使用以下 XSLT 做到了这一点:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:element name="n:root" xmlns:n="http://foo.bar">
<xsl:element name="child" />
</xsl:element >
</xsl:template>
</xsl:stylesheet>
...但是我想在 classes 上使用 .NET XmlSerializer 和 System.Xml.Serialization 属性。我创建了以下两个 classes:
[XmlRoot(ElementName = "root", ElementNamespace = "http://foo.bar")]
public class Root
{
[XmlElement(ElementName = "child")]
public Child Child { get; set; }
}
public class Child {}
然后我尝试将命名空间添加到 XmlSerializer 并使用 XmlSerializerNamespaces class:
对其进行序列化public string Foo()
{
var root = new Root { Child = new Child() };
var ns = new XmlSerializerNamespaces();
ns.Add("n", "http://foo.bar");
var s = new XmlSerializer(typeof(Root));
var sb = new StringBuilder();
var xml = XmlWriter.Create(sb);
s.Serialize(xml, root, ns);
return sb.ToString();
}
不过方法returns下面XML:
<n:root xmlns:n="http://foo.bar">
<n:child/>
</n:root>
如何让XmlSerializer避免给内部元素添加命名空间前缀?
inb4: 我知道子元素没有其父元素的名称空间看起来很奇怪,但这是我从客户端收到的消息的形状,我需要创建模拟相同行为的模拟 Web 服务。
像这样改变你的 Root
class 应该可以做到:
[XmlRoot(ElementName = "root", Namespace = "http://foo.bar")]
public class Root
{
// note empty namespace here
[XmlElement(ElementName = "child", Namespace = "")]
public Child Child { get; set; }
}