2012-11-19 8 views
0

나는 문제가 있으며, 무엇이 문제인지 파악할 수 없다. 목록 상자에서 XML 파일에 요소를 삽입하고 싶습니다. 목록 상자에는 문자열과 int 변수가있는 Menuelem 요소가 있습니다. 목록에서 XML에 요소 추가하기

<?xml version="1.0" encoding="utf-8" ?> 
<orders> 
<user id="0"> 
    <order id="0"> 
    <date>2012.11.19. 2:16:12</date> 
    <menuelem db = "0"> 
    <name>asdasdas</name> 
    <price>1000</price> 
    <menuelem db = "1"> 
    <name>asds</name> 
    <price>2000</price> 
    </order> 
<user id="0"> 
    <order id="1"> 
    <date>2012.11.19. 2:16:15</date> 
    <menuelem db = "0"> 
     <name>asdasdas</name> 
     <price>1000</price> 
    <menuelem db = "1"> 
     <name>asds</name> 
     <price>2000</price> 
    </order> 
</user> 
</orders> 

사람이 LINQ 사용하여이 문제를 해결 할 수

:

dt = DateTime.Now; 
    XDocument doc = XDocument.Load(path); 

    XElement user = new XElement("user", new XAttribute("id", id), 
         new XElement("order", new XAttribute("id", key), 
          new XElement("date", dt.ToString())) 
        ); 
    doc.Element("orders").Add(user); 
    doc.Save(path); 
    foreach (Menuelem item in listBox6.Items) 
    { 
     int j=0; 
     var menuelem = new XElement("menuelem", new XAttribute("db", j), 
         new XElement("name", item.Nev), 
         new XElement("price", item.Ar)); 
     doc.Element("order").Add(menuelem); //throws nullreferenceexception 
     doc.Save(path); 
     j++; 
    } 

    listBox6.Items.Clear(); 
    label3.Text = ""; 
    key++; 

} 

은 내가 내 XML을보고 싶은 것은이 같은입니까?

답변

-1

코드는 루트 요소 ("orders") 만 포함하고 결과가 null 인 문서의 바로 하위 요소로 "order"요소를 찾으려고 시도합니다. 요소를 검색하는 내용과 null을 반환하는 경우 자세한 내용은 을 참조하십시오.

새로 삽입 한 요소를 올바르게 선택해야합니다. 간단한 옵션은

doc.Descendants("order").Last().Add(menuelem); 

쉬운 옵션은 완전히 "사용자"요소를 구축하고보다 것은 트리에 추가하는 것입니다 (다만 추가로 추가 한 사용자입니다) 이름으로 Descendants을 사용하고 마지막 하나를 선택하는 것입니다. 방금 추가 된 노드에 대해 문서를 검색 할 필요가 없습니다. 당신은 다음 방법 "요소"를 사용할 수 있습니다 "사용자"내 대신 여러 요소가있는 경우이

XElement element = doc.Element("orders").Element("user").Element("order"); 
element.Add(menuelem); 

을 할 필요가 있도록 루트 요소로하지 "위하여"를 가지고 있기 때문에

+1

-1 : OP의 마음을 읽고 원래의 문제를 해결하려면 분명히 틀립니다. OP는 "menuitem"요소를 방금 추가 한 특정 사용자에게 추가하려고합니다. 솔루션에있는 것처럼 문서에있는 첫 번째 사용자가 아닌 것입니다. –

+0

@DanielT - Fyodor Soikin은 좋은 지적입니다. 추가 된 사용자 만 사용해야합니다 (또는 사용자를 완전하게 만들고 문서에 추가하는 것보다 낫습니다). –

+0

모든 답변을 주셔서 감사합니다. – fzl

-1

분명히 문서에 "order"요소가 없으므로 doc.Element("order")이 null을 반환하기 때문에 NullReferenceException이 발생합니다.

+0

-1. Daniel은 주문 (사용자의 자녀)을 추가합니다. 검색이 잘못되었습니다. –

+0

@AlexeiLevenkov : 내 대답에서 무엇이 잘못 되었습니까? –

+0

"순서가 없습니다"문이 잘못되었습니다 - 체크 아웃'.Add (사용자);'- 사용자가 직접 자식으로 주문을 포함합니다. 문제는 "order"요소가 루트 요소의 바로 하위 요소가 아니므로 루트 요소의 "Element"함수로 찾을 수 없다는 것입니다. –

0

당신은 null 참조를 가지고 "요소". "Element"메서드는 첫 번째 요소를 반환하고 "Elements"메서드는 XElement의 IEnumerable을 반환합니다.