2014-10-01 2 views
1

제 의도는 멋진 사전 (키와 값 모두 문자열 임)을 반복하고 XML 파일을 만드는 것입니다.사전에서 XML 문서 만들기 문제

마지막 줄에 오류가 표시됩니다 (XML 저장 중).

"InvalidOperationException이 처리되지 않았습니다. 상태 문서의 토큰 EndDocument가 잘못된 XML 문서가됩니다." 이 사용 중단을 통해 찾고

은 이것의 끝에 도달에 그런 것 같다 (각 루프의 외부) 초기 비트는 내가 반 무슨 바보 같은 실수를 부탁 해요 ..

을 수행하고있다 나는이 일을하는 더 웅변적인 방법이 있는지 부분적으로 묻고 있습니다.

죄송합니다. 무엇이라도 놓친 경우 알려 주시면 알려 드리겠습니다. 사전이 비어있는 경우 그래서 당신이 (중 없는 루트 요소로 끝날 것 -

XDocument xData = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes")); 

foreach (KeyValuePair<string, string> kvp in inputDictionary) 
{ 
     xData.Element(valuesName).Add(
      new XElement(valuesName, 
      new XAttribute("key", kvp.Key), 
      new XAttribute("value", kvp.Value))); 
} 

xData.Save("C:\\xData.xml"); 
+2

xDoc 및 valuesName과 같은 코드에 대한 자세한 정보를 제공 할 수 있습니까? –

+0

실제로 - 당신은 무시하고있는'xData'를 가지고 있지만'xDoc'는 아닙니다. 현재 귀하의'xData' 문서는 단지 XML 선언을 가지고 있습니다 ... 루트 요소조차 가지고 있지 않습니다. 문제를 시연하는 짧지 만 완전한 * 프로그램을 제공해주십시오. –

+0

바로 지적 해 주셔서 고마워요. 나는 그것을 지금 편집했다. 내가 뭘 잘못했는지 알아 내려고 할 때 다른 xDocument를 시도했지만 이제는 이것이 모두 xData (그냥 오타)를 불러들입니다. 위의 내용을 수정했습니다. – Jonny

답변

4

현재 당신이 추가하는 여러 요소를 직접 문서에 시도) 또는 잠재적으로 루트 요소 (사전에 둘 이상의 항목이있는 경우). 당신은 루트 엘리먼트를 원하고 그 아래에 사전 엘리먼트를 원한다. 또한 valuesName이라는 요소를 추가하지 않고이라는 요소를 찾으므로 사전 항목이 있으면 실제로는 NullReferenceException이 표시됩니다.

LINQ를 사용하여 사전을 일련의 요소로 변환하고이를 문서에 넣을 수 있기 때문에 다행히도, 작성한 것보다 훨씬 쉽습니다.

var doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"), 
    new XElement("root", 
     inputDictionary.Select(kvp => new XElement(valuesName, 
              new XAttribute("key", kvp.Key), 
              new XAttribute("value", kvp.Value))))); 
doc.Save(@"c:\data.xml"); 

완전한 샘플 응용 프로그램 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 

class Test 
{  
    static void Main() 
    { 
     XName valuesName = "entry"; 
     var dictionary = new Dictionary<string, string> 
     { 
      { "A", "B" }, 
      { "Foo", "Bar" } 
     }; 
     var doc = new XDocument(
      new XDeclaration("1.0", "utf-8", "yes"), 
      new XElement("root", 
       dictionary.Select(kvp => new XElement(valuesName, 
               new XAttribute("key", kvp.Key), 
               new XAttribute("value", kvp.Value))))); 
     doc.Save("test.xml"); 
    } 
} 

출력 (항목의 순서는 보장되지 않습니다) :

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<root> 
    <entry key="A" value="B" /> 
    <entry key="Foo" value="Bar" /> 
</root> 

이에 대한 대안 고장은 다음과 같습니다

var elements = inputDictionary.Select(kvp => new XElement(valuesName, 
             new XAttribute("key", kvp.Key), 
             new XAttribute("value", kvp.Value))); 
var doc = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"), 
    new XElement("root", elements)); 

이 방법이 더 간단 할 수 있습니다. 독서.

+0

완벽한 친구, 고마워.나는 기본적으로 내가 한 일을 자르고 당신의 지시를 따랐다. – Jonny

1

는 다음

XDocument xData = new XDocument(
        new XDeclaration("1.0", "utf-8", "yes")); 

       XElement myXml = new XElement("paramList");// make sure your root and your descendents do not shre same name 
       foreach (var entry in MyList) 
       { 
         myXml.Add(new XElement(valuesName, 
           new XElement("key", entry.key), 
           new XElement("value", entry.Value) 
       )); 

xData.Add(myXml);