2017-02-28 1 views
0

다음 XML 문서가 있습니다.속성이 해당 요소에 연결될 때 C#에서 XML 요소의 값을 찾습니다.

<ns0:ProductQuantity> 
    <ns0:Measurement> 
     <ns0:MeasurementValue>8500</ns0:MeasurementValue> 
     <ns0:UnitOfMeasureCode Domain="UN-Rec-20">KG</ns0:UnitOfMeasureCode> 
    </ns0:Measurement> 
</ns0:ProductQuantity> 

이 문서의 "KG"값을 내 C# 코드의 문자열로 읽는 방법을 아직 알지 못했습니다. 다른 요소 값을 추출했지만 그 중 어느 것도이 속성이 Domain="UN-Rec->20"에 붙어 있습니다. Visual Studio 2013을 사용하고 있으며 현재 다른 데이터를 추출하는 방법에 대한 아이디어는 다음과 같습니다.

XmlDocument doc = new XmlDocument(); 
doc.Load(filePath);    
root = doc.DocumentElement; 
prodAmt_xml[1] = root.GetElementsByTagName("ns0:MeasurementValue")[0].InnerText; 

누구나이 문제를 유발하고 이러한 '측정 단위'를 얻을 수있는 방법이 있다면 매우 감사 할 것입니다.

답변

1

XML 네임 스페이스를 고려해야합니다. ns0은 실제로 요소 이름의 일부가 아니며 이름 공간 (일반적으로 URL)에 매핑되는 접두사입니다. ns0의 URL을 가정 XML과 C# 6 Linq에 사용

http://foo.bar/입니다 :

var doc = XDocument.Load(filePath); 
var ns = XNamespace.Get("http://foo.bar/"); 
var unit = 
    doc.Descendants(ns + "ProductQuantity") 
     .Elements(ns + "Measurement") 
      .Elements(ns + "UnitOfMeasureCode") 
      .Where(e => e.Attribute("Domain")?.Value == "UN-Rec->20") 
      .Select(e => e.Value) 
      .FirstOrDefault(); 
?.는 C# 6을 필요로하는 것으로

; 이전 버전을 사용하는 경우 다음을 수행 할 수도 있습니다.

var doc = XDocument.Load(filePath); 
var ns = XNamespace.Get("http://foo.bar/"); 
var unit = 
    (from e doc.Descendants(ns + "ProductQuantity") 
       .Elements(ns + "Measurement") 
       .Elements(ns + "UnitOfMeasureCode") 
    let attr = e.Attribute("Domain") 
    let domain = attr != null ? attr.Value : null 
    where domain == "UN-Rec->20" 
    select e.Value).FirstOrDefault(); 
+0

'LINQ'및 'XML'라이브러리 참조를 사용하더라도 이러한 명령을 사용할 필요가 없습니다. "ns0 : UnitOfMeasureCode"를 요소 이름으로 취급하고 첨부 된 속성과 네임 스페이스를 무시할 수있는 방법이 있습니까? ".GetElementsByTagName ("ns0 : UnitOfMeasureCode ", [@ Domain ="UN-Rec-20 "]) '형식의 참조를 보았지만 제대로 작동하지 않았습니다. 그게 도움이된다면 .Net 4.5와 함께 C# 5.0을 사용하고 있다고 생각합니다. – MBrockley

+0

@MBrockley 당신은'System.Xml.Linq.dll'에 대한 참조가 필요합니다. 여기에서 사용하는 C# 6 기능은'? '입니다. 필요없는 코드 버전을 보내 드리겠습니다. –

+0

""ns0 : UnitOfMeasureCode "를 요소 이름으로 취급하고 첨부 된 속성과 네임 스페이스를 무시할 수있는 방법이 있습니까?" 아니, XML이 작동하는 방식이 아니야. –

관련 문제