将数据写入现有Xml

时间:2016-04-14 10:14:15

标签: c# xml linq-to-xml win-universal-app

我正在使用Visual Studio 2015在Windows 10上开发一个通用的Windows应用程序,并且有一个非常大的Xml结构如下:

<header id = "1">
    <title>
        some text
    </title>
    <question>
        a question
    </question>
    <user_input>
        <input1>
        </input1>
        <input2>
        </input2>
    </user_input>
</header>

<header id = "2">
    <title>
        some text
    </title>
    <question>
        a question
    </question>
    <user_input>
        <input1>
        </input1>
        <input2>
        </input2>
    </user_input>
</header>
...

这是重复多次。有些部分永远不应该改变(例如标题,问题)。现在我想将新元素写入&#34; ui&#34;,因此可以再次阅读并在texbox中显示新内容。 我使用FileStream和XmlDocument以及XmlNodeList来读取Xml并在textblocks上显示内容:

path = "test.xml";
FileStream stream = new Filestream(path, FileMode.Open, FileAcces.Read);
XmlDocument xdoc = new XmlDocument();
xdoc.Load(reader);
XmlNodeList node = xdoc.GetElementsByTagName("header");
textblock1.Text = node[0].Attributes["id"].Value;
textblock2.Text = node[i].ChildNode[1].InnerText;
....

我试过写入Xml:

XDocument xdoc = XDocument.Load(path);
XElement ele = xdoc.Element("header");
ele.Add(new XElement("user_input",
        new XElement("input1", newtext)));
        xdoc.Save(path); <---- at this point there is an error

&#34;参数1:无法转换为&#39; string&#39;到&#39; System.IO.Stream&#39;&#34;

我的问题是:如何将用户输入(某些字符串)写入我想要的位置?第一个输入应写入id = 1的标题进入user_input,第二个进入标题id =&#34; 2&#34;等等。我已经尝试使用XDocument加载xml并使用XElement编写一个新元素,但它可以工作。我的xml有问题吗?还是它的功能?提前谢谢。

1 个答案:

答案 0 :(得分:1)

首先,xml文件不能包含相同的根,这里有两个headers节点,但没有看到根节点。所以我添加了一个根节点来测试你的xml文件,如下所示

<?xml version="1.0" encoding="utf-8"?>
<Topics>
<header id = "1">
...
</header>
</Topics>

其次,这个错误

  

“参数1:无法从'string'转换为'System.IO.Stream'”

xdoc.save(string)在uwp中不可用,您可以在详细信息中查看XDocument.Save method的版本信息。

第三,对于这个问题

  

如何将用户输入(某些字符串)写入我想要的位置?

我们可以通过xpathGetElementsByTagName方法将值插入特殊元素。在uwp中,我建议您使用Windows.Data.Xml.Dom命名空间而不是System.xml.Ling

这里我写了一个插入值到特殊地方的演示。并将演示文件上传到GitHub,您可以下载CXml进行测试。

主要是代码

private async void BtnXmlWrite_Click(object sender, RoutedEventArgs e)
{
    String input1value = TxtInput.Text;
    if (null != input1value && "" != input1value)
    {
        var value = doc.CreateTextNode(input1value);
        //find input1 tag in header where id=1
        var xpath = "//header[@id='1']/user_input/input1";
        var input1nodes = doc.SelectNodes(xpath);
        for (uint index = 0; index < input1nodes.Length; index++)
        {
            input1nodes.Item(index).AppendChild(value);
        }
        RichEditBoxSetMsg(ShowXMLResult, doc.GetXml(), true);    
    }
    else
    {
        await new Windows.UI.Popups.MessageDialog("Please type in content in the  box firstly.").ShowAsync();
    }
}

您可以参考XML dom SampleXML and XPath了解更多详情。