2011-08-09 13 views
1

모두XML 파일에서 특정 항목 추출

저는 C#을 사용하여 XML 파일에서 항목 모음을 추출하려고 시도하는 코드를 작성했습니다. 나는 주위를 읽고되었고 XML 계층 구조의 상대적 복잡성으로 인해 그러나

using System.Xml.XPath; 
using System.Xml.Linq; 

를 사용하여 LINQ의 길을 가기로 결정했다, 나는와 관계있는 요소에 액세스하는 방법을 통해 조금 혼란 얻고있는 이 경우 다음과 같은 XML에서 'dCost'와 'iCost'입니다

<?xml version="1.0" encoding="utf-8"?> 
<message xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    pStart="2010-01-01T12:12:12" 
    pEnd="2010-01-01T12:12:12" 
    fYear="2010-11" 
    OrgID="21122211" xmlns="urn://www.XXXX.com/vcopdc/2011/01/v0.5"> 
    <episodes> 
    <episode 
     eKey="001448101" 
     ur="1219765" 
     campus="1334" 
     eStart="17/01/2010 6:00:00 AM" 
     eEnd="17/01/2010 11:00:00 AM" 
     stream="X" 
     dob="6/12/1936 12:00:00 AM" 
     atsi="2" 
     pCode="3075"> 
     <episodeCosts> 
     <episodeCost 
      area="A0902" 
      description="General ATOMIC" 
      account="GF" 
      dCost="0.0393072400937604" 
      iCost="0.156445858061913" 
      location="101" 
      sDate="17/01/2000 12:00:00 AM" /> 
     <episodeCost 
      area="AAS2W" 
      description="General ATOMIC" 
      account="LAB" 
      dCost="0.0169883227585181" 
      iCost="0.0110702327817353" 
      location="101" 
      sDate="17/01/2000 12:00:00 AM" /> 
     </episodeCosts> 
    </episode> 
    </episodes> 
</message> 

지금까지 도착하여 dCost 읽기 전용으로 다음은 무엇을 : 어떤 작업을 수행

var doc = XDocument.Load(strFileName); 
var values = doc.XPathSelectElements("//message/episodes/episode/episodeCosts"); 
foreach (var item in values) 
{ 
    foreach (var att in item.Elements("episodeCost")) 
    { 
     var value = att.Attribute("dCost").Value; 
    } 
} 

을 즉, 구문이 올바르지 않기 때문에 원하는 요소를 찾지 못합니다. 많은 예제를 살펴 보았지만 XML은 항상 임베드되지 않으므로 예제를 확장하기가 어렵습니다. 어떤 도움이라도 대단히 감사 할 것입니다.

편집 :

using (var reader = XmlReader.Create(strFileName)) 
{ 
    while (reader.Read()) 
    { 
     // Some code here. 
    } 
} 

가 다시 어떤 도움이 가장

를 감사 : 지금 인해 내 XML 파일이 너무 커서 사실, 내가 좋아하는 뭔가를 사용할 필요가 있음을 깨달았다.

답변

0

이렇게하면 결국 어떻게됩니까? 아마도 그것은 미래에 누군가를 도울 것입니다.

double dTotalICostMM = 0.0, dTotalDCostMM = 0.0; 
decimal dCost = Decimal.Zero, iCost = Decimal.Zero; 
using (XmlReader reader = XmlReader.Create(strFileName)) 
{ 
    while (reader.Read()) 
    { 
     if (reader.NodeType == XmlNodeType.Element && reader.Name == "episodeCost") 
     { 
      dCost = Convert.ToDecimal(reader.GetAttribute("dCost")); 
      iCost = Convert.ToDecimal(reader.GetAttribute("iCost")); 
     } 
    } 

    // Add each cost to its total for the month 
    dTotalDCostMM += (double)dCost; 
    dTotalICostMM += (double)iCost; 
} 

도움 주셔서 감사합니다.

1

x- 경로의 에피소드가 두 번 있습니다. // message/episodes/episode/episodeCosts가 아니어야합니다.

편집 : x- 경로 쿼리가 결과를 반환하지 않는다고 가정합니다. 그렇지 않다면 어떻게됩니까? 당신은 단지

var doc = XDocument.Load(strFileName); 
var CostElements = doc.Elements("message").Elements("episodes").Elements("Episode").Elements("episodeCosts").Elements("EpisodeCost"); 
foreach(var cost in CostElements) 
{ 
    var iCost = cost.Attribute("icost").Value; 
    var dCost = cost.Attribute("dcost").Value; 
} 

으로이 작업을 수행 할 수

+0

예 결과를 반환하지 않습니다. 사과드립니다. 편집 내용에 맞습니다. 그것이 내가 가진 것입니다. 나는 이제 이것을 버리겠다. – MoonKnight

1

것은 당신을 위해 그 일을합니까?

+0

아쉽게도 작동하지 않습니다. 다시 var CostElements에 아무것도 반환하지 않습니다. 즉, CostElements.name = null, CostElements.value = null입니다. 그래도 도와 ​​줘서 고마워. 또 다른 것은 내 XML 파일이 커질 수 있기 때문에 지금은 위의 코드 대신 'var reader = XmlReader.Create (strFileName)) {...}'을 사용하고 싶습니다. – MoonKnight

1

xmlns 정의를 제거하면 xmlns="urn://www.XXXX.com/vcopdc/2011/01/v0.5" 코드가 작동합니다. Xml 네임 스페이스를 사용하려면 XPathSelectElements Method (XNode, String, IXmlNamespaceResolver).here

+0

이것은 작동하지 않았습니다. 감사. – MoonKnight

관련 문제