簡體   English   中英

是否可以使用屬性指定XML節點名稱和深度

[英]Is it possible to specify a XML node name and depth with attributes

我想將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; }
}

不,在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類型的屬性,並手動解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM