2012-07-18 2 views
0

나는 더 이상 풀 수없고 신선한 통찰력이 필요한 문제가 있습니다. 키 쌍 값이 되려면 다음 XML 구조가 필요합니다.C# xml 대 키 쌍 값

XML은

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <page> 
    <title>Home</title> 
    <url>http://data.home.nl</url> 
    <page> 
     <title>link 1</title> 
     <url>http://data.home.nl/link1.aspx</url> 
     <page> 
      <title>link 2</title> 
      <url>http://data.home.nl/link/link2.aspx</url> 
      <page> 
       <title>link 3</title> 
       <url>http://data.home.nl/link/link/link3.aspx</url> 
      </page> 
      <page> 
       <title>Test 4</title> 
       <url>http://data.home.nl/link/link/test4.aspx</url> 
      </page> 
      <page> 
       <title>Test 5</title> 
       <url>http://data.home.nl/link/link/test5.aspx</url> 
      </page> 
      <page> 
       <title>Test 6</title> 
       <url>http://data.home.nl/link/link/test6.aspx</url> 
      </page> 
      <page> 
       <title>Test 7</title> 
       <url>http://data.home.nl/link/link/test7.aspx</url> 
      </page> 
     </page> 
     </page> 
    </page> 
</data> 

내가 뭘 달성하기 위해 필요하면와 키 쌍 값에, 내가 잃었어요 ....

감사합니다!

* 업데이트 된 XML이

+0

사용합니다. 그리고 비 직렬화 할 클래스가 있습니까? – mattanja

+0

XML 예제의 요소 중첩이 잘못되어 루트 요소가 닫히지 않았습니다. – vcsjones

+0

가능한 중복 [linq를 사용하여 XML에서 키 값 쌍 가져 오기] (http://stackoverflow.com/questions/1716004/get-key-value-pairs-from-xml-using-linq) – CJM

답변

0

개인적으로 미안, 내가 페이지 개체의 목록을 만들 것하고 역 직렬화 :

List<MyPage> pages; 
0

귀하의 XML이 되지 않습니다 : 그런 다음에 역 직렬화

[XmlRoot(name="page"] 
public class MyPage 
{ 
    [XmlElement(name="titel")] 
    public string Title { get; set; } 
    [XmlElement(name="url")] 
    public string Url { get; set; } 
} 

을 유효. 당신은 그것을 검사 할 수 있습니다 here

그것은 typo이고 당신은 아래의 형식으로 유효한 XML을 가지고 있다고 가정합니다.

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <page> 
     <titel>link 3</titel> 
     <url>http://data.home.nl/link/link/link3.aspx</url> 
    </page> 
    <page> 
     <titel>Test 4</titel> 
     <url>http://data.home.nl/link/link/test4.aspx</url> 
    </page>   
</data> 

그럼 당신은 그것을 조회하고

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 

var path = Server.MapPath("~/Content/pairs.xml"); 

XElement elm = XElement.Load(path); 
//you can also load the XML from a stream /Textreader etc.. 

if (elm != null) 
{  
    foreach (var page in elm.Elements("page")) 
    { 
     var title = page.Element("titel").Value; 
     var url = page.Element("url").Value; 
     dictionary.Add(title, url); 
    } 
} 
//dictionary is filled now 

난 당신이 취급 적절한 오류를 추가 할 것입니다 확신

는 (항상 요소에 액세스하는 일부를 적용하기 전에 null 검사를 포함 원하는대로 할 LINQtoXML을 사용할 수 있습니다 메서드 또는 속성 값을 읽음)

1

Shyju가 이미 지적했듯이 XML 형식이 올바르지 않습니다. 또한 요소가 titel 대신 title 인 것을 의미한다고 가정합니다. 그 대답은 XML 문자열에있는 내용이므로 titel을 사용했습니다.

난 당신이 LINQ to XML를 사용하여 결과를 얻을 수 있다고 생각 :

var xmlString = // set your xml string here 
var xml = System.Xml.Linq.XElement.Parse(xmlString); 

var myDictionary = xml.Elements() 
    .Select(e => new KeyValuePair<string, string>(
     e.Element("titel").Value, 
     e.Element("url").Value)) 
    .ToDictionary(k => k.Key, v => v.Value); 

편집

난 당신이 질문을 편집하고 페이지가 실제로 계층 적 참조하십시오.

public static IEnumerable<T> Recursive<T>(
    this IEnumerable<T> source, 
    Func<T, IEnumerable<T>> recursiveFunc) 
{ 
    foreach (T item in source) 
    { 
     yield return item; 
     var result = recursiveFunc(item); 

     if (result != null) 
     { 
      foreach (T nextItem in Recursive(result, recursiveFunc)) 
      { 
       yield return nextItem; 
      } 
     } 
    } 
} 

다음과 같이 당신의 사전을 만들 :이 문제를 처리하기 위해, 당신은 재귀 처리하는 LINQ 확장 방법을 만들 수

var myDictionary = xml.Elements() 
    .Recursive(e => e.Elements()) 
    .Where(e => e.Element("title") != null && e.Element("url") != null) 
    .Select(e => new KeyValuePair<string, string>(
     e.Element("title").Value, 
     e.Element("url").Value)) 
    .ToDictionary(k => k.Key, v=> v.Value); 
0

귀하의 XML 재귀 형태이다.

저장 부모 - 자식 관계에 필요한 경우

, 중첩 된 클래스 대신의 XML이 깨진 것 같다 Dicitionary

public class Page 
{ 
    public string Title { get; set; } 
    public string Url { get; set; } 
    public List<Page> childPage {get; set;} 
}