在XmlSerializer.Serialize上省略一个节点

时间:2011-02-21 11:11:00

标签: c# xmlserializer

我有一个由第三方提供的类库,其中的类型名为SaveAccount。当我尝试序列化这个类时,我得到以下xml:

<?xml version="1.0" encoding="utf-16"?>
<SaveAccount xmlns="http://RiskBrowser/ExposureManager">
  <Body>
    <Token>JHSDUKJSHDKJ</Token>
    <JobId>2</JobId>
  </Body>
</SaveAccount>

我需要做的是删除<Body>标签,以便我最终得到这个:

<?xml version="1.0" encoding="utf-16"?>
<SaveAccount xmlns="http://RiskBrowser/ExposureManager">
  <Token>JHSDUKJSHDKJ</Token>
  <JobId>2</JobId>
</SaveAccount>

在XmlSerializer中有这么好的方法吗?还是别人能想到的另一种好方法?我真的不想开始使用生成的xml进行攻击。

非常感谢提前

3 个答案:

答案 0 :(得分:2)

如果Body是公共属性(即SaveAccount不是IXmlSerializable)并且SaveAccount中没有其他属性要序列化,则可以通过序列化删除此节点直接Body并应用XML序列化程序属性覆盖来重命名并将正确的命名空间分配给结果元素。否则,您可以创建自定义XmlWriter并在写入时禁止此节点。

答案 1 :(得分:1)

使用XmlIgnore属性标记类型,如下所示:

[XmlIgnore]
public AType Body;

如果无法重建第三方库,则可以使用XmlAttributeOverrides类覆盖序列化对象的默认方式,类似于:

XmlAttributes ignore = new XmlAttributes() { XmlIgnore = true};
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
overrides.Add(typeof (AType), "Body", ignore);
XmlSerializer ser = new XmlSerializer(typeof(BType), overrides);

答案 2 :(得分:0)

在这种情况下,一种方法是在生成XML之后使用BodyLINQ to XMLSystem.Xml移除{{1}}节点。