新手需要帮助。
我正在处理的文件只是“主要是” XML,所以这可能是我的问题的一部分。另外,我正在学习C#(我是一名Visual Basic程序员)。这让我很慢!
文件的结构如下所示:
<Book>
<bookObjects>
<HardCover>
<pagesList>
<pages id = "123" />
<pages id = "456" />
<pages id = "789" />
</pagesList>
</HardCover>
<!-- some valid XML followed by a bunch of elements that look like this -->
<dm><?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_19" class="java.beans.XMLDecoder">
<object class="java.util.LinkedList">
<void method="add">
<object class="java.util.HashMap">
<!-- etc, this is just a sample -->
</dm>
<pagesList>
<pages id = "987" />
<pages id = "654" />
<pages id = "321" /> <!-- I want to insert before this line -->
</pagesList>
</bookObjects>
</Book>
所以我的问题是我想向SECOND pagesList节点/ element / whatchacallit添加更多页面,这不是HardCover节点内的页面。 (请原谅我,如果我说错了话,这对我来说是全新的。)
我尝试了很多事情。我要么得到空结果,要么得到第一个,即HardCover内部的结果。
这是我目前所拥有的,写错了。
private void WriteToFile ()
{
// Get the output file as an xml document
//XDocument doc = XDocument.Load(outputBook.ToString());
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(outputBook.ToString());
//Find the pagesList node
//This doesn't work: it only gets the first one despite not being at the root
//XmlNode foundNode = xmlDoc.SelectSingleNode("//pagesList");
XmlNode foundNode = xmlDoc.SelectSingleNode("//Book//bookObjects//pagesList");
if (foundNode != null)
{
XmlElement eleItem = xmlDoc.CreateElement("InsertTest");
eleItem.InnerText = DateTime.Now.ToString("h:mm:ss tt");
foundNode.AppendChild(eleItem);
}
//doc.Save(outputBook.ToString());
xmlDoc.Save(outputBook.ToString());
}
结果文件:
<?xml version="1.0" encoding="UTF-8"?>
<Book id="stuff deleted from example" >
<bookObjects>
<HardCover id="bf9a0769-23b0-4da7-bf81-b63034ec7704">
<pagesList>
<pages id="991da2a8-d2ac-45fb-b325-92cae2a5613f" />
<pages id="f66107c7-a4a8-487f-857a-6e53637ff085" />
<InsertTest>12:49:20 AM</InsertTest> <!-- darn you! wrong spot! -->
</pagesList>
</HardCover>
我已经尝试过XmlDocument和XDocument。我试过在开头加上单斜线,双斜线和点。这么多的事情。但是不对。
(现在)我很高兴能够获得正确的pagesList节点...我确实需要在最后一个当前元素之前插入一个新元素,如上面的注释所示。 。 (即,最后一个必须保持为最后一个。)
更新:
我是个白痴。所以,很抱歉! / Book / bookObjects / pagesList根本不是正确的路径。我想要/ Book / pagesList。难怪它返回null。 (这就是我睡前两个小时熬到的头,撞到这堵墙的感觉。)
因此,现在我将其定位到正确的部分;我只需要接下来将其放置在正确的位置即可。
答案 0 :(得分:0)
在XPath中,//
的意思是“此处的任何地方”,而不仅仅是直接子级。
我认为您将通过以下XPath查询获得更多的运气:"/Book/bookObjects/pagesList"
。