-1

私はいくつかのXMLドキュメントを持っています:

events.xml:

<?xml version="1.0" encoding="UTF-8"?>
<events>
  <event>
    <id>9</id> 
    <region>3</region> 
    <region>12</region> 
    <region>29</region> 
  </event>
  <event> 
    <id>7</id> 
    <region>1</region>
    <region>12345</region>
  </event>
  <event> 
    <id>3</id> 
    <region>12</region>
    <region>39</region> 
    <region>56</region> 
  </event>
  <event> 
    <id>8</id> 
    <region>8</region> 
    <region>123</region> 
    <region>456</region>
  </event>
  <event> 
    <id>4</id> 
    <region>999</region> 
    <region>888</region> 
    <region>777</region> 
  </event>
</events>

Exposure.xml:

<?xml version="1.0" encoding="UTF-8"?>
<companies>
  <company> 
    <id>6</id>
    <region>3</region>
    <region>9</region> 
    <region>8</region>
    <region>11111</region> 
    <region>12</region> 
  </company>
  <company> 
    <id>4</id> 
    <region>3</region> 
    <region>6</region> 
    <region>7</region> 
    <region>12345</region> 
  </company>
  <company> 
    <id>9</id> 
    <region>1</region> 
    <region>2</region> 
    <region>3</region> 
  </company>
</companies>

2つのファイルを処理するプログラムを作成する必要があります。

イベントファイル内のイベントごとに、プログラムはイベント番号に続いて、影響を受ける企業のセットを公開ファイルに書き出す必要があります。会社のリストは会社番号の昇順で書き出す必要があります。

サンプルファイルを考えると、出力は次のようになります。

9 4 6 9

 8 6

 7 4 9

 3 6
4

2 に答える 2

3

あなたの人生に少しLINQを持ってください。

var eventsDoc = XDocument.Load(@"events.xml");
var exposureDoc = XDocument.Load(@"exposure.xml");

var companies =
   (from c in exposureDoc.Descendants("company")
    let id = (int)c.Element("id")
    orderby id
    select new
    {
        Id = id,
        Regions = new HashSet<int>(
            from r in c.Elements("region")
            select (int)r),
    }).ToList();
var events =
    from e in eventsDoc.Descendants("event")
    let id = (int)e.Element("id")
    orderby id descending
    select new
    {
        Id = id,
        Regions = from r in e.Elements("region")
                  select (int)r,
    };
foreach (var evnt in events)
{
    var affectedCompanies =
        from c in companies
        where c.Regions.Overlaps(evnt.Regions)
        select c.Id;
    if (affectedCompanies.Any())
        Console.WriteLine("{0} {1}", evnt.Id, String.Join(" ", affectedCompanies));
}

.NET 3.5を使用している場合は、ループの本体のクエリを少し変更する必要があります。

var affectedCompanies =
   (from c in companies
    where c.Regions.Overlaps(evnt.Regions)
    select c.Id.ToString()).ToArray();
于 2012-05-12T16:18:25.900 に答える
1

XIncludeを使用すると、次のようにこれら2つを効果的に組み合わせて1つのドキュメントにすることができます。

<?xml version="1.0" ?>
<combination xmlns:xi="http://www.w3.org/2001/XInclude">
    <xi:include href="events.xml" />
    <xi:include href="exposure.xml" />
</combination>

その後、

  1. XmlDocumentを使用して「結合された」ドキュメントを読み込みます
  2. SelectNodesを使用して、イベントのリストをプルします(XPath: `//event/id./')
  3. SelectNodesを使用して、各イベントのリージョンのリストを取得します
  4. SelectNodesを使用して、各地域の影響を受ける企業を引き込みます

XmlDocumentフレームワークとXPathの使用方法に関するドキュメントはたくさんあります。たとえば、この質問

于 2012-05-12T16:00:46.940 に答える