3

我想将 C# 类结构序列化为 XML,并提供特定的节点名称,而不必拥有一堆嵌套类。这可能使用属性吗?

例如,假设我有以下 XML:

<OuterItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <InnerItem>
        <ItemValue>something i need</ItemValue>
    </InnerItem>
</OuterItem>

我有一个如下所示的 XML 序列化方法:

public static string XmlSerializeToString<T>(T value)
{
    if (value == null) { return null; }

    XmlSerializer serializer = new XmlSerializer(typeof(T));

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = false;
    settings.OmitXmlDeclaration = true;

    using (StringWriter textWriter = new StringWriter())
    using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
    {
        serializer.Serialize(xmlWriter, value);
        return textWriter.ToString();
    }
}

我必须有这样的 C# 类结构吗?

public class OuterItem
{
    public InnerItem InnerItem { get; set; }
}

public class InnerItem
{
    public string ItemValue { get; set; }
}

或者是否有可能声明我的节点在 XML 文档中的位置应该是这样的(伪代码):

public class OuterItem
{
    [XmlNode("InnerItem\ItemValue")]
    public string ItemValue { get; set; }
}
4

1 回答 1

0

不,不能在 XmlNode 属性中使用 xpath 或类似的表达式。您选择的用于控制 xml 序列化的属性非常有限。

您可以使用以下 hack 反序列化您拥有的 xml:

public class OuterItem
{
    [XmlArrayItem(ElementName="ItemValue", Type=typeof(string))]
    [XmlArray]
    public string[] InnerItem
    {
        get; set;
    }
}

public class Test
{
    static void Main()
    {
        var item = new OuterItem { InnerItem = new[]{"AAA"} };
        XmlSerializer ser = new XmlSerializer(typeof(OuterItem));
        ser.Serialize(Console.Out,item);
    }
}

这将产生以下xml:

<?xml version="1.0" encoding="utf-8"?>
<OuterItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <InnerItem>
    <ItemValue>AAA</ItemValue>
  </InnerItem>
</OuterItem>

另一种可能的解决方案是使用 XmlTextAttribute,将内部 xml 获取到 XmlNode 类型的属性中,然后手动解析。

于 2013-04-16T21:36:29.110 回答