0

LINQを使用して複雑なXMLファイルを解析しようとしています。ファイルには数千のレコードが含まれ、それぞれに数百のフィールドがあります。各薬に関する情報の特定の部分を解析してデータベースに保存する必要があります。

編集: 申し訳ありませんが、最初に投稿されたXMLは実際には正確ではありませんでした。属性がプロセスを変更するという事実に気づいていませんでした。XMLファイルの本質を正確に表現するために質問を更新しました。

XMLのサンプルは次のとおりです。

<<drugs xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://drugbank.ca" xs:schemaLocation="http://www.drugbank.ca/docs/drugbank.xsd" schemaVersion="1.4">
   <drug>
      <name>foo</name>
      <indication>Some info here</indication>
      <half-life>1 to 3 hours</half-life>
      <protein-binding>90%</protein-binding>
        // hundreds of other elements
      <properties>
         <property>
            <kind>logP/hydrophobicity</kind>
            <value>-0.777</value>
         </property>
         <property>
            <kind>Molecular Weight</kind>
            <value>6963.4250</value>
         </property>
         <property>
            <kind>Molecular Formula</kind>
            <value>C287H440N80O110S6</value>
         </property>
         //dozens of other properties
      </properties>
   </drug>
   // thousands of more drugs
</drugs>

LINQを使用するのはこれが初めてなので、実際のクエリについてはかなりあいまいです。私はSQLに精通しているので、複雑なクエリの概念は私にとって難しいことではありませんが、この問題に役立つと理解できるドキュメントを見つけることができませんでした。私がこれまでに持っているクエリは次のとおりです。

XDocument xdoc = XDocument.Load(@"drugbank.xml");

var d = from drugs in xdoc.Descendants("drug")
                        select new
                        {
                            name = drugs.Element("name").Value,
                            indication = drugs.Element("indication").Value,
                            halflife = drugs.Element("half-life").Value,
                            proteinBinding = drugs.Element("protein-binding").Value,
                        };

最初の問題は(理論的には)解決されています。に...

2番目の問題は、いくつかのプロパティ(つまり、疎水性、分子量、分子式)を抽出する必要があるという事実ですが、混乱しているのは、プロパティの種類とプロパティ値が2つの異なるXElementに格納されていることです。関心のあるフィールドにプロパティ値を制限するにはどうすればよいですか?

4

2 に答える 2

1

サブクエリを実行して、プロパティを外部ジェネリックオブジェクトの別のプロパティに取り込むことができます。それらをネストしたい場合:

XNamespace defaultNS = "http://drugbank.ca";

var d = from drugs in xdoc.Descendants(defaultNS + "drug")
        select new
        {
            name = drugs.Element(defaultNS + "name").Value,
            indication = drugs.Element(defaultNS + "indication").Value,
            halflife = drugs.Element(defaultNS + "half-life").Value,
            proteinBinding = drugs.Element(defaultNS + "protein-binding").Value,
            Properties = (from property in drugs.Element(defaultNS + "properties").Elements(defaultNS + "property")
                          let kind = property.Element(defaultNS + "kind").Value
                          where kind == "logP/hydrophobicity" || kind == "Molecular Weight" || kind == "Molecular Formula"
                          select new { Kind = kind, Value = property.Element(defaultNS + "value").Value })
        };

または平坦化:

XNamespace defaultNS = "http://drugbank.ca";

var d = from drugs in xdoc.Descendants(defaultNS + "drug")
        let properties = drugs.Element(defaultNS + "properties").Elements(defaultNS + "property")
        select new
        {
            name = drugs.Element(defaultNS + "name").Value,
            indication = drugs.Element(defaultNS + "indication").Value,
            halflife = drugs.Element(defaultNS + "half-life").Value,
            proteinBinding = drugs.Element(defaultNS + "protein-binding").Value,
            hydrophobicity = (from property in properties
                          let kind = property.Element(defaultNS + "kind").Value
                          where kind == "logP/hydrophobicity"
                          select property.Element(defaultNS + "value").Value).FirstOrdefaultNS(),
            molecularWeight = (from property in properties
                          let kind = property.Element(defaultNS + "kind").Value
                          where kind == "Molecular Weight" || kind == "Molecular Formula"
                          select property.Element(defaultNS + "value").Value).FirstOrdefaultNS(),
            molecularFormula = (from property in properties
                          let kind = property.Element(defaultNS + "kind").Value
                          where kind == "Molecular Formula"
                          select property.Element(defaultNS + "value").Value).FirstOrdefaultNS()
        };

また、Linqについて学ぶのに役立つ非常に便利なリファレンスは101LINQSamplesです

于 2012-07-03T21:30:13.787 に答える
1

私はあなたのコードを貼り付けました:出力:

foo
Some info here
1 to 3 hours
90%

期待通り

于 2012-07-03T20:13:37.507 に答える