2011-06-14 41 views
1

我想读出一个xml文件到一个文本块,用户可以在textblock中编辑这个文本,并将附加的变化应用回xml文件......我目前被卡住了。这是我到目前为止已经完成:streamreader读出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> 
    <email> 
.. 
    </email> 
    <buildstream1> 
     <path value="apple"/> 
    </buildstream1> 
    <buildstream2> 
     <path value="pear"/> 
     <path value="bananas"/> 
    </buildstream2> 
</xml> 

的问题是:

我怎么读出的行xml文件?

我只对获取xml文件的某些部分感兴趣,我只得到<buildstream1> & <buildstream2>被读出吗?

回答

1

我建议不要尝试读取它像一个文本文件,而是使用数据适配器。只要xml文件是有效的xml,它就可以很好地工作。

然后,您可以根据所需的选项使用数据绑定文本框,数据网格,组合框或各种其他工具 - 此外,您不必担心用户搞乱了xml的结构或编写自己的逻辑来过滤。

这里是一些代码示例,使用大致相同的方法,我会采取。谷歌搜索将更多地揭示hundres。

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

+2

不是每个XML都可以绑定到数据网格。 – 2011-06-14 06:49:57

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 2011-06-14 06:48:46

+0

对于XML岩石来说,Linq是的。但是,我的理解是,它不能以流模式工作 - 任何人都可以确认。从问题主题我(可能错误地)认为这是一个要求? – sehe 2011-06-14 06:57:50

+0

关于你的代码,我看到当我使用时只显示一个元素。如果我有另一个元素'“xml/buildstream2”'那么我怎样才能将它添加到文本框? – jeremychan 2011-06-15 02:14:11

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); } 
    } 
} 

将打印

apple 
pear 
bananas 

谷歌为众多的XPath教程之一

0

一种方式做,这是阅读的字符串和负载到XmlDcument中。这样你就可以很容易地找到任何特定的元素。

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。