2014-10-16 2 views
0

이것은 제가 가장 잘 알고있는 질문 일 수 있습니다. 이것은 내 XML의 일부입니다. 내가 얻고 자하는 것은 다른 속성 인 "ItemOID"에 기반한 "Value"속성입니다. 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")가 필요합니다. 값; 라인은 ItemOID = "I_NEURO_NEURO_NORMAL"과 같은 조건을 갖습니다. 그래서 한 번에 하나의 속성을 데이터 테이블에 넣을 수 있습니다. 도와주세요. 고맙습니다.

+0

향후 질문에 코드 서식을 지정하기 위해 노력하십시오. 어떻게 현재 버전에 게시했는지 비교하고, 다음에 미리보기를 사용하여 제출 전에 적절한 들여 쓰기를 확인하십시오. 사람들이 질문을 읽고 이해할 수있게 만들수록 더 많은/더 나은 대답을 얻을 수 있습니다. –

+0

죄송합니다. Jon. 게시시 초보자. 건배. – user3276223

답변

1

ItemGroupData 요소에 대해 새 행을 원하는 것처럼 보입니다. 각 요소는 ItemData이 아닙니다. 당신은 속성의 많은를 추출하는 경우 당신이 사전을 만들 수있다, 또는

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

: 새로운 확장 방법을 사용

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); 
} 

: 내가 좋아하는 뭔가를 기대

var values = itemGroup.Elements("ItemData") 
         .ToDictionary(x => x.Attribute("ItemOID").Value, 
            x => x.Attribute("Value").Value); 
+0

그게 아주 우아하고 놀라운 솔루션입니다. 이 Xpath // oc : FormData [@ FormOID = 'F_NEUROLOGICAL_V20']를 쿼리에 추가 할 수 있습니까? 나는 FormData에 기반하여 그것을 숨기고 싶다. 이것은 많은 user3276223

+0

@ user3276223 : Xpath를 사용하지 않을 것입니다. doc.Descendants (ns + "FormData")를 사용합니다. 여기서 (x => x.Attribute ("FormOID"), Value == "F_NEUROLOGICAL_V20")'여기서'ns'는 적당한 네임 스페이스입니다 (이것은'oc'라고 가정합니다). XPath를 대신 사용할 수는 있지만, 도움이된다면 XPath를 다른 언어에 포함시키지 않는 편이 더 좋습니다. –

관련 문제