2012-04-13 4 views
2

저는이 질문이 간단한 질문이지만 긍정적으로 생각할 수는 없습니다.'name'을 검색하여 'value'요소를 검색하십시오.

나는 C#에서 문자열에 XML 파일을 다운로드하고있어, 그것은 다음과 같은 형식의 항목이 포함되어

<attribute name="Make" value="Volvo" /> 
<attribute name="Color" value="Blue" /> 
<attribute name="Damage" value="Rear scratched" /> 
<attribute name="Damage" value="Left hand side dented" /> 

그리고 내가 원하는 모두가 "손상에 대한 값의 모든를 얻을입니다 "전체 문서에서 (그들이 떨어지는 위치에 관계없이) 배열로. 나는 XmlDocument/XmlNodeList를 가지고 놀았지만이 작업을 수행하는 방법을 알 수 없다.

저는 RegEx를 사용하여 유혹을 받았지만 매우 유감 스럽습니다.

+0

Linq to XML = 빠르고 읽기 쉬운 코드를 사용하십시오. http://msdn.microsoft.com/en-us/library/bb387098.aspx – Sogger

+0

제목 앞에 "XML/C#"등을 붙이지 마십시오. 그것이 바로 태그가있는 것입니다. –

답변

7

사용 XDocument :

var doc = XDocument.Parse(xml); 
var result = doc.Descendants("attribute") 
       .Where(x => x.Attribute("name") != null && 
          x.Attribute("value") != null) 
       .Where(x => x.Attribute("name").Value == "Damage") 
       .Select(x => x.Attribute("value").Value) 
       .ToArray(); 

주의 사항 :이 계정에 전체 문서의 모든 attribute 노드를 필요하기 때문에
이 코드는 비교적 간단하다.

+1

주의 사항 : 질문에있는 속성 목록은이 코드와 함께 "현재 상태"로 작동하지 않습니다. "루트 요소"가 없습니다. "attribute"요소에 부모 "attributes"요소가있는 경우이 코드 샘플은 완벽하게 작동합니다. –

+0

@GlennFerrieLive :이 코드는 문제가되지 않지만 제공된 샘플 데이터는 유효 XML이 아니며 관련 부분 만 OP에 표시한다고 가정했습니다. –

+0

나는 당신에 동의합니다. –

1
string val = ""; 
XmlDocument doc = new XmlDocument(); 

doc.Load("file.xml"); 

XmlNodeList nodes = doc.SelectNodes("/attribute[@name='Damage']"); 

foreach (XmlNode node in nodes) 
{ 
    { 
     val = node.Attributes["value"].Value; 
    } 
} 

+1

죄송합니다, 코드는 이미 편집되었습니다 –

+0

@DanielHilgarth 코드는 편집 주석에 대한 응답으로 제거하겠다는 본인의 원래 의견부터 편집되었습니다. – Sogger

1

LINQ-TO-XML을 활용할 수 있지만 XML을 제공하므로 수동으로 루트 노드를 만들면 System.Xml.XmlException : There are multiple root elements.이됩니다.

// raw - your XML 
string raw = File.ReadAllText("c:\\test1.xml"); 

// create root node manually 
string xml = "<root>" + raw + "</root>"; 
var xdoc = XDocument.Parse(xml);  

// contains IEnumerable<string> 
// TODO: add null-checks 
var damagedValues = xdoc.Descendants("attribute") 
         .Where(e => e.Attribute("name").Value == "Damage") 
         .Select(e => e.Attribute("value").Value); 
1

음, XML 문서가 아닙니다. 조각입니다. 루트 요소로 래핑해야합니다. 작동합니다 :

string fragment = File.ReadAllText("file.xml"); 
var doc = XDocument.Parse("<root>" + fragment + "</root>"); 

var values = from element in doc.XPathSelectElements(@"//attribute[@name='Damage']") 
      select element.Attribute("value").Value; 

values.ToList().ForEach(Console.WriteLine); 
관련 문제