1

XML:

<shift_details>
    <shift_time>10:00 to 10:30</shift_time>
    <count>0</count>
    <shift_time>10:30 to 11:00</shift_time>
    <count>0</count>
    <shift_time>11:00 to 11:30</shift_time>
    <count>0</count>
    <shift_time>11:30 to 12:00</shift_time>
    <count>0</count>
    <shift_time>12:00 to 12:30</shift_time>
    <count>0</count>
</shift_details>

コード:

var slots = from c in xmlResponse.Descendants("shift_details")
            select new TimeSlots
            {
                time = (string)c.Element("shift_time"),
                count = (string)c.Element("count"),
            };

上記のコードは、出力として 1 つのスロット項目のみを返しますが、xml に含まれるレコードが多すぎます。

上記のxmlですべてのレコードを読み取る方法は?

4

2 に答える 2

5

これElementは、指定された名前の最初の要素のみを返すためです。XML 構造を変更して、異なるスロットを互いに分離することを検討する必要があります。たとえば、次のようになります。

<shift_details>
    <shift>
        <shift_time>10:00 to 10:30</shift_time>
        <count>0</count>
    </shift>
    (...)
</shift_details>

そして、次のようにクエリします。

var slots = from c in xmlResponse.Element("shift_details").Elements("shift")
            select new TimeSlots
            {
                time = (string)c.Element("shift_time"),
                count = (string)c.Element("count"),
            };

または、XML を変更できない場合でもクエリを実行できますが、少し複雑になります。

var doc = XDocument.Load("Input.txt");
var details = doc.Root;

var times = details.Elements("shift_time");
var counts = details.Elements("count");

var slots = times.Zip(counts, (t, c) => new { time = (string)t, count = (string)c }).ToList();
于 2013-08-22T12:06:14.860 に答える
0

一方、XML の構造を変更できない場合は、工夫を凝らす必要があります (お勧めはしませんが)。この場合、要素のコレクションを取り、それぞれが一意の要素を含むチャンクに分割する次のようなもので、おそらく問題ありません (長期的には保守性が低くなります)。

public static class Extensions
{
    public static IEnumerable<IEnumerable<XElement>> Partition(this IEnumerable<XElement> elements)
    {
        var currentList = new List<XElement>();
        var tags = new HashSet<string>();

        foreach (var xElement in elements)
        {
            if (tags.Contains(xElement.Name.LocalName))
            {
                yield return currentList.ToArray();
                currentList.Clear();
                tags.Clear();
            }

            currentList.Add(xElement);
            tags.Add(xElement.Name.LocalName);
        }

        yield return currentList.ToArray();
    }
}

次に、これを介して shift_details の下で子のコレクションを実行し、かなり簡単に処理できるグループを取得できます。ここからまっすぐ進む必要があります。

于 2013-08-22T12:35:02.327 に答える