1

良い一日、

XML ドキュメントをクエリしようとしていますが、次のクエリがあります。

XElement root = XElement.Load(@"..\..\Data.xml");
var entries = root.Descendants()
              .Where(x => x.Name.LocalName == "Entry")
              .ToList();

Console.WriteLine("There are {0} nodes...", entries.Count());
foreach (XElement v in entries)
{
    Console.WriteLine(v.Value);
}

このコードは、正しい数のエントリ ノードをプルするため機能します。エントリ ノードは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<Database xmlns="http://www.someurl.org/schemas">
    <InfoFromRecord>
        <BaseData>
            <Entry>
                <Date>2006-03-08</Date>XD
                <Time>09:20:00</Time>
                <EnteredBy>DNS</EnteredBy>
                <TextEntry>Record 1</TextEntry>
            </Entry>
            <Entry>
                <Date>2006-03-08</Date>
                <Time>09:33:00</Time>
                <EnteredBy>MW</EnteredBy>
                <TextEntry>Record 2</TextEntry>
            </Entry>
            <Entry>
                <Date>2006-03-08</Date>
                <Time>08:58:00</Time>
                <EnteredBy>BH</EnteredBy>
                <TextEntry>Record 3</TextEntry>
            </Entry>
        </BaseData>
    </InfoFromRecord>
</Database>

問題は、4 つのフィールドすべてではなく、日付と時刻だけを抽出したいということです。

4

4 に答える 4

6

わかりやすい例として、XML ファイル全体が次のようになっているとします。

<Entries>
    <Entry>
        <Date>2006-03-08</Date>
        <Time>09:33:00</Time>
        <EnteredBy>XX</EnteredBy>
        <TextEntry>Test Data</TextEntry>
    </Entry>
</Entries>

次に、次のようなことができます。

var document = XDocument.Load(@"..\..\Data.xml");
var dateAndTimes =
    from d in document.Root.Descendants("Entry")
    select new
                {
                    Date = d.Element("Date").Value,
                    Time = d.Element("Time").Value
                };

そこから、型は日付と時刻の匿名型dateAndTimesを選択します。匿名型を独自の型または別の型に変更できます。


編集:問題はあなたxmlnsです。コードを次のように変更します。

XNamespace namespc = "http://www.someurl.org/schemas";
var document = XDocument.Parse(xml);
var dateAndTimes =
    from d in document.Root.Descendants(namespc + "Entry")
    select new
                {
                    Date = d.Element(namespc + "Date").Value,
                    Time = d.Element(namespc + "Time").Value
                };
于 2012-08-16T16:00:18.137 に答える
0
foreach (XElement v in entries)
{
    Console.WriteLine(v.Element("Date").Value);
    Console.WriteLine(v.Element("Time").Value);
}

は、直接の子のみを検索する子Descendants、孫など、任意のレベルで子を検索することを忘れないでください。したがって、ほとんどの場合、安全なオプションElementsだと思います。Elements

編集:XMLを見た後

データを取得するときに名前空間も含める必要があります

XNamespace ns = "http://www.someurl.org/schemas";
var entries = elm.Descendants().Where(x => x.Name.LocalName == "Entry").ToList();
foreach (XElement v in entries)
{
    Console.WriteLine(v.Element(ns+"Date").Value);
    Console.WriteLine(v.Element(ns+"Time").Value);
}
于 2012-08-16T15:49:32.237 に答える
0

私はそれを試す機会がありませんでしたが、次のようなものがあなたが探しているものを与えるかもしれません

var entries = from i in root.Descendants() 
where Name=='entry' 
let date = i.Element('Date').Value 
let time = i.ELement('Time').Value 
select new Tuple<string,string>(date,time);
于 2012-08-16T15:57:09.190 に答える