2011-06-14 5 views
1

xml 파일을 textblock으로 읽고 싶습니다. 사용자가 textblock에서이 텍스트를 편집하고 xml 파일에 추가 변경 사항을 적용 할 수 있습니다 ... 현재 붙어 있습니다. streamreader가 xml 파일의 라인을 읽음

<xml> 
    <email> 
.. 
    </email> 
    <buildstream1> 
     <path value="apple"/> 
    </buildstream1> 
    <buildstream2> 
     <path value="pear"/> 
     <path value="bananas"/> 
    </buildstream2> 
</xml> 

질문

은 다음과 같습니다 :

내가의 라인을 읽을 어떻게 여기

private void Editbuildstreams_Click(object sender, RoutedEventArgs e) 
    { 
     BuildstreamTextblock.Visibility = Visibility.Visible; 
     using (StreamReader srr = new StreamReader("initial.xml")) 
     { 
      string line; 
      while ((line = srr.ReadLine()) != null) 
      { 
       BuildstreamTextblock.Text = line; 
      } 
     } 
    } 

XML 파일의 구조입니다 : 이것은 내가 지금까지 한 일이다 XML 파일?

xml 파일의 특정 부분을 얻는 데에만 관심이 있습니다. <buildstream1> & <buildstream2>을 읽어야합니까?

답변

1

텍스트 파일처럼 읽지 말고 대신 데이터 어댑터를 사용하는 것이 좋습니다. xml 파일이 유효한 xml이면 아주 잘 작동합니다.

그런 다음 필요한 옵션에 따라 데이터 바인딩 된 텍스트 상자, 데이터 그리드, 콤보 상자 또는 다양한 다른 도구를 사용할 수 있습니다. 사용자가 XML 구조를 엉망으로 만들거나 자신 만의 논리를 필터로 작성하는 것에 대해 걱정할 필요가 없습니다.

다음은 대략 동일한 방식을 사용하는 일부 코드 샘플입니다. 인터넷 검색은 hundres를 더 많이 나타냅니다.

http://www.codeproject.com/KB/cpp/dataset.aspx

+2

모든 XML을 DataGrid에 바인딩 할 수있는 것은 아닙니다. –

3

이런 식으로 뭔가?

var originalDocument = XDocument.Load(fileName); 
var originalElement = originalDocument.XPathSelectElement("xml/buildstream1"); 
textBox.Text = originalElement.ToString(); 

// do changes in the text box 

var newDocument = XDocument.Parse(textBox.Text); 
var newElement = newDocument.Elements().Single(); 

// insert edited element 
originalElement.AddAfterSelf(newElement); 

// remove original element 
originalElement.Remove(); 
originalDocument.Save(fileName); 

// or 

var resultXml = originalDocument.ToString(); 
+0

XDocument로 작업하지는 않았지만 공유 한 코드가 너무 멋져서 시작할 수 있습니다 ... +1 – RThomas

+0

XML을 사용하는 Linq 예. 그러나 스트리밍 모드에서는 작동하지 않는다는 것이 내 이해입니다. 누구든지 확인할 수 있습니다. 질문 주제에서 나는 이것이 틀림없이 요구 사항이라는 것을 모았다. – sehe

+0

코드에 관해서는, 내가 사용할 때 단 하나의 요소 만 표시된다는 것을 알 수 있습니다. 만약 다른 요소''xml/buildstream2 ''가 있다면 어떻게 텍스트 상자에 추가 할 수 있습니까? – jeremychan

0

이는 의심의 여지가, 당신이 읽고 싶어하는 좋은 기사입니다 XPathReader (사용에서보세요 도움 완전). 예 :

<xml> 
    <email> 
.. 
    </email> 
    <buildstream1> 
     <path value="apple"/> 
    </buildstream1> 
    <buildstream2> 
     <path value="pear"/> 
     <path value="bananas"/> 
    </buildstream2> 
</xml> 

예를

using System; 
using System.Xml; 
using System.Xml.XPath; 
using GotDotNet.XPath; 

public class Test 
{ 
    public static void Main(string[] args) 
    { 
     try 
     { 
      XPathReader xpr = new XPathReader("input.xml", "//*/[email protected]"); 

      while (xpr.ReadUntilMatch()) 
       Console.WriteLine(xpr.ReadString()); 
      Console.ReadLine(); 
     } 
     catch(XPathReaderException xpre) 
     { Console.WriteLine("XPath Error: " + xpre); } 
     catch(XmlException xe) 
     { Console.WriteLine("XML Parsing Error: " + xe); } 
     catch(IOException ioe) 
     { Console.WriteLine("File I/O Error: " + ioe); } 
    } 
} 

가 많은 XPath에 자습서 중 하나에 대해이 작업을 수행하는

0

한 가지 방법을

apple 
pear 
bananas 

구글을 인쇄 할 것인가하는 캐릭터 라인 및 부하를 읽는 것입니다 XmlDecument에 저장합니다. 이렇게하면 특정 요소를 쉽게 찾을 수 있습니다.

private void Editbuildstreams_Click(object sender, RoutedEventArgs e) 
{ 
    BuildstreamTextblock.Visibility = Visibility.Visible; 
    XmlDocument doc = new XmlDocument(); 
    using (XmlTextReader reader = new XmlTextReader("initial.xml")) 
    { 
     reader.Read(); 
     doc.Load(reader); 

     StringBuilder line = new StringBuilder(); 
     line.apend (doc.doc.GetElementsByTagName("buildstream1")[0].outerXml; 

     BuildstreamTextblock.Text = line; 
    } 
} 

마찬가지로 조작 한 후에는 XmlDocument 개체를 사용하여 변경 내용을 다시 원래의 xml에 다시 할당 할 수 있습니다.