3

Stackoverflowには、このテーマに関してすでにいくつかの質問があることは知っていますが、タグを繰り返すことについての答えはまだ見つかりませんでした。私がそのようなXML構造を持っている場合:

<root>
    <block>
        <PositionX>100</PositionX>
        <PositionY>100</PositionY>
        <block>
            <PositionX>10</PositionX>
            <PositionY>15</PositionY>
            <button>
            </button>
        </block>
        <button>
        </button>
    </block>
</root>

上記の構造では、ブロック内にボタンを、ブロック内にブロックを含めることができます。これは私が現在使用しているコードであり、ネストされたアイテムを許可していません。

デシリアライズ:

    public static GUI Deserialize(string filename)
    {
        GUI gui = null;
        XmlSerializer serializer = new XmlSerializer(typeof(GUI));
        StreamReader reader = new StreamReader(filename);
        gui = (GUI)serializer.Deserialize(reader);
        reader.Close();
        return gui;
    }

ルートクラス:

[Serializable()]
[XmlRoot("View")]
public class GUI
{
    [XmlArray("Blocks")]
    [XmlArrayItem("Block", typeof(GUIBlock))]
    public GUIBlock[] Blocks { get; set; }
}

ブロック:

[Serializable()]
public class GUIBlock
{
    [XmlElement("Name")]
    public string Name { get; set; }

    [XmlElement("Position")]
    [XmlAttribute("X")]
    public int PositionX { get; set; }

    [XmlElement("Position")]
    [XmlAttribute("Y")]
    public int PositionY { get; set; }

    [XmlElement("Width")]
    public int Width { get; set; }

    [XmlElement("Height")]
    public int Height { get; set; }

    [XmlElement("Background")]
    public string Background { get; set; }

    [XmlElement("Opacity")]
    public int Opacity { get; set; }

    // I also want to allow nested Blocks and Buttons in here, but I **dont** explicitly want to say:
    [XmlArray("Blocks")]
    [XmlArrayItem("Block", typeof(GUIBlock))]
    public GUIBlock[] Blocks { get; set; }
}

考えられるすべての組み合わせを定義せずにアイテムを再帰的にループする答えを得る方法はありますか?

ブロックにブロックのリストとボタンのリストを、ボタンにブロックのリストとブロックのリストを与えたくありません。そして、新しいタグごとにオプションを追加します。

デシリアライズせずにXPathを使用することもできますが、自分で調べないと、親/子に関する情報がわかりません。これについて何か助けはありますか?

4

3 に答える 3

1

それらのアイテムを含むListNodeを作成せずに、オブジェクトの配列を逆シリアル化するにはどうすればよいかと質問されていると思いますか?

たとえば、XMLは次のようになっている必要があるという要件があります。

<Library>
    <Location></Location>
    <Book></Book>
    <Book></Book>
    <Book></Book>
</Library>

そしてそれはこのように見えることはできません:

<Library>
    <Location></Location>
    <BookCollection>
       <Book></Book>
       <Book></Book>
       <Book></Book>
    <BookCollection>
</Library>

C#オブジェクトでこれを行う方法は、次のようになります。

[Serializable]
public class Library
{
    [XmlElement]
    public string Location {get;set;}

    [XmlElement("Book")]
    public Book[] Book {get; set;}

}

public class Book 
{
    /// ....
}
于 2013-02-08T17:02:09.803 に答える
0

各ノードを通過するために再帰関数を作成する必要がありますが、実行できることは次のとおりです。

// This groups all sub-elements of a node by their name.
// If there is more than one node with the same name, .Count() will return > 1
Int32 numberOfSameNameNodes = 
    node.Elements()
        .GroupBy(element => element.Name)
        .Count(elementsGroupedByName => elementsGroupedByName.Count() > 1);

// if there are duplicately named sub-nodes then 
if (numberOfSameNameNodes > 0)
{
   ...
}

そして、これにより、ノードに重複するサブノードがあるかどうかが決まります。

于 2013-02-08T16:51:20.073 に答える
0

デシリアライズではできないと思うので、探していた答えが見つかりませんでした。これで、Blockクラスにもブロックのリストが含まれるようになり、再帰的にループできるようになりました。

于 2013-02-27T15:47:29.757 に答える