EDIT @Gert Arnoldの助言によれば、私は編集してより完全に私の質問を書式化しました。LinqをC言語で使用して2つのサブノードの選択肢を渡すノードを選択してください
私は、idと値の条件を渡すノードをLinq経由で選択しようとしています。私の場合、SeriesKey
ノード内に2つの特定のvalue
属性を持つノードを持つseries
が必要です。
ここで私はちょうどクエリの道を行くとしようとした私のXML文字列(あなたはどのマークアップのミスを見つけたならFYI、彼らは原因私のインデントのミスに、元のファイルはXML有効あるかもしれません)
<message:GenericData xmlns:footer="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message/footer"
xmlns:generic="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic"
xmlns:message="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message"
xmlns:common="http://www.sdmx.org/resources/sdmxml/schemas/v2_1/common"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<message:DataSet>
<generic:Series>
<generic:SeriesKey>
<generic:Value id="GEO" value="124"/>
<generic:Value id="PRODUCT" value="4400"/>
<generic:Value id="FIN" value="03"/>
<generic:Value id="ENERGY_UNITS" value="WSR"/>
</generic:SeriesKey>
<generic:Obs>
<generic:ObsDimension id="TIME_PERIOD" value="1999"/>
<generic:ObsValue value="0"/>
<generic:Attributes>
<generic:Value id="UNIT_SUFFIX" value="R"/>
</generic:Attributes>
</generic:Obs>
<generic:Obs>
<generic:ObsDimension id="TIME_PERIOD" value="2000"/>
<generic:ObsValue value="0"/>
<generic:Attributes>
<generic:Value id="UNIT_SUFFIX" value="R"/>
</generic:Attributes>
</generic:Obs>
</generic:Series>
<generic:Series>
<generic:SeriesKey>
<generic:Value id="GEO" value="124"/>
<generic:Value id="PRODUCT" value="4100"/>
<generic:Value id="FIN" value="03"/>
<generic:Value id="ENERGY_UNITS" value="WSR"/>
</generic:SeriesKey>
<generic:Obs>
<generic:ObsDimension id="TIME_PERIOD" value="1999"/>
<generic:ObsValue value="8246"/>
<generic:Attributes>
<generic:Value id="UNIT_SUFFIX" value="R"/>
</generic:Attributes>
</generic:Obs>
<generic:Obs>
<generic:ObsDimension id="TIME_PERIOD" value="2000"/>
<generic:ObsValue value="40733"/>
<generic:Attributes>
<generic:Value id="UNIT_SUFFIX" value="R"/>
</generic:Attributes>
</generic:Obs>
</generic:Series>
<generic:Series>
<generic:SeriesKey>
<generic:Value id="GEO" value="124"/>
<generic:Value id="PRODUCT" value="4200"/>
<generic:Value id="FIN" value="03"/>
<generic:Value id="ENERGY_UNITS" value="WSR"/>
</generic:SeriesKey>
<generic:Obs>
<generic:ObsDimension id="TIME_PERIOD" value="1999"/>
<generic:ObsValue value="279"/>
<generic:Attributes>
<generic:Value id="UNIT_SUFFIX" value="R"/>
</generic:Attributes>
</generic:Obs>
<generic:Obs>
<generic:ObsDimension id="TIME_PERIOD" value="2000"/>
<generic:ObsValue value="324"/>
<generic:Attributes>
<generic:Value id="UNIT_SUFFIX" value="R"/>
</generic:Attributes>
</generic:Obs>
</generic:Series>
</message:DataSet>
</message:GenericData>
ですwhere
ステートメントのように、論理演算子を使用して一連のステップを作成します。私は問題の方法を封じ込めました。この時点で、xml文字列(上記の1つ)と2つのフィルタリング条件、つまりEnergyProduct
を受け入れてPRODUCT
属性をフィルタリングし、EconSector
をフィルタリングしてFIN
属性をフィルタリングします。
public IEnumerable<XElement> DataSetFilter(string XmlString, string EnergyProduct, string EconSector)
{
XDocument sdmx_response = XDocument.Parse(XmlString);
XNamespace message = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/message";
XNamespace generic = "http://www.sdmx.org/resources/sdmxml/schemas/v2_1/data/generic";
IEnumerable<XElement> DataSet = sdmx_response.Root.Elements(message + "DataSet");
IEnumerable<XElement> Series = from series in DataSet.Elements(generic + "Series")
from serieskey in series.Elements(generic + "SeriesKey")
from value in serieskey.Elements(generic + "Value")
where
(
(string)value.Attribute("id") == "PRODUCT" && (string)value.Attribute("value") == EnergyProduct
) ||
(
(string)value.Attribute("id") == "FIN" && (string)value.Attribute("value") == EconSector
)
select serieskey;
IEnumerable <XElement> observationsSet = from observations in Series.Elements(generic + "Obs").Elements(generic + "ObsValue") select observations;
return observationsSet;
}
問題は、それが含まれているだけのノードであるPRODUCT
コード「4400」とFIN
コード「03」と何私が探していると一致するもの、たとえば、両方の属性のすべてのデータをつかむことですそれらの正確な値を持つサブノードは両方とも同じSeriesKey
です。私は問題のXML要素を構成する匿名オブジェクトを作成することを考えていましたが、エラーが発生しましたが、それを適切に実装する方法はまだ混乱しています。 ありがとうございました!
あなたのXMLは無効です。あなたがそれをhttp://www.xmlvalidation.comにアップロードすると、エラーが表示されます。 '16:要素タイプ「シリーズ」は、一致する終了タグ「」で終わらなければなりません。 ? – dbc
ありがとうございます。コードを貼り付ける間に間違いをしたようです。私の場合、XML検証は問題ではありませんでした。 – Cristiansen
'where|'節でなぜ' || 'を使うのか、なぜなら*両方の*条件を満たすサブノードが必要なのかどうか不明です。 – Tomer