我有一个由第三方提供的类库,其中的类型名为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进行攻击。
非常感谢提前
答案 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
之后使用Body
或LINQ to XML
从System.Xml
移除{{1}}节点。