0

これは、私が謝罪するための最も簡単な質問かもしれません. これは私のxmlの一部です。私が取得したいのは、別の属性「ItemOID」に基づく属性「値」です。IE ItemOID="I_MEDIC_HISTORY_INDICATION" の場合、値は何ですか。

<FormData FormOID="F_NEUROLOGICAL_V20" OpenClinica:Version="V2.0" OpenClinica:Status="initial data entry">
    <ItemGroupData ItemGroupOID="IG_NEURO_UNGROUPED" ItemGroupRepeatKey="1" TransactionType="Insert">
        <ItemData ItemOID="I_NEURO_NEURO_TENDONAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_TENDON" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_GAITAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_GAIT" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_COORDINATEAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_COORDINATE" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_SENSORYAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_SENSORY" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_MUSCLETONEAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_MUSCLETONE" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_MOTORAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_MOTOR" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_CRANIALAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_CRANIAL" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_SPEECHAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_SPEECH" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_BEHAVEAB" Value="abnormal" />
        <ItemData ItemOID="I_NEURO_NEURO_BEHAVE" Value="0" />
        <ItemData ItemOID="I_NEURO_NEURO_APPEARAB" Value="" />
        <ItemData ItemOID="I_NEURO_NEURO_APPEAR" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_NORMAL" Value="1" />
        <ItemData ItemOID="I_NEURO_NEURO_DATE" Value="2014-10-10" />
    </ItemGroupData>
</FormData>

これは私のコードです。お分かりのように、私は少し立ち往生しています。

string neuroExamPath = "//oc:FormData[@FormOID='F_NEUROLOGICAL_V20']/oc:ItemGroupData/oc:ItemData";
var neuroExamList = doc.XPathSelectElements(neuroExamPath, nsmgr).Reverse();

foreach (var neuroExamElement in neuroExamList)
{
    var patrow = patDt.NewRow();
    var I_NEURO_NEURO_NORMAL = neuroExamElement.Attribute("Value").Value;
    patrow["Neuro_normal"] = I_NEURO_NEURO_NORMAL;
    var I_NEURO_NEURO_APPEAR = neuroExamElement.Attribute("Value").Value;
    patrow["Neuro_appear"] = I_NEURO_NEURO_APPEAR;
    var I_NEURO_NEURO_APPEARAB = neuroExamElement.Attribute("Value").Value;
    patrow["Neuro_appearab"] = I_NEURO_NEURO_APPEARAB;

    patDt.Rows.Add(patrow);
}

おわかりのように、すべての属性値を常に反復します。ただし、var I_NEURO_NEURO_NORMAL = neuroExamElement.Attribute("Value").Value; が必要です。ItemOID="I_NEURO_NEURO_NORMAL" などの条件を持つ行。したがって、一度に 1 つの属性をデータテーブルに入れることができます。助けてください。ありがとうございました。

4

1 に答える 1

1

ItemGroupData各要素ではなく、要素ごとに新しい行が必要なようですItemData。私は次のようなものを期待します:

foreach (var itemGroup in doc.Root.Elements("ItemGroupData"))
{
    var row = patDt.NewRow();
    row["Neuro_normal"] = itemGroup.ExtractValue("I_NEURO_NEURO_NORMAL");
    row["Neuro_appear"] = itemGroup.ExtractValue("I_NEURO_NEURO_APPEAR");
    row["Neuro_appearab"] = itemGroup.ExtractValue("I_NEURO_NEURO_APPEARAB");
    patDt.Rows.Add(row);
}

新しい拡張メソッドを使用します:

public static string ExtractValue(this XElement parent, string oid)
{
    return parent.Elements("ItemData")
                 .Where(x => x.Attribute("ItemOID").Value == oid)
                 .First()
                 .Attribute("Value")
                 .Value;
}

または、多くの属性を抽出する場合は、辞書を作成できます。

var values = itemGroup.Elements("ItemData")
                      .ToDictionary(x => x.Attribute("ItemOID").Value,
                                    x => x.Attribute("Value").Value);
于 2014-10-16T09:39:32.310 に答える