我正在使用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有问题吗?还是它的功能?提前谢谢。
答案 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的版本信息。
第三,对于这个问题
如何将用户输入(某些字符串)写入我想要的位置?
我们可以通过xpath
或GetElementsByTagName
方法将值插入特殊元素。在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 Sample,XML and XPath了解更多详情。