如何使用C#将元素插入格式不正确的XML文件中的特定节点中?

时间:2018-12-02 08:56:17

标签: c# xml

新手需要帮助。

我正在处理的文件只是“主要是” 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>&lt;?xml version="1.0" encoding="UTF-8"?&gt; 
     &lt;java version="1.6.0_19" class="java.beans.XMLDecoder"&gt; 
     &lt;object class="java.util.LinkedList"&gt; 
     &lt;void method="add"&gt; 
     &lt;object class="java.util.HashMap"&gt; 
     <!-- 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。 (这就是我睡前两个小时熬到的头,撞到这堵墙的感觉。)

因此,现在我将其定位到正确的部分;我只需要接下来将其放置在正确的位置即可。

1 个答案:

答案 0 :(得分:0)

在XPath中,//的意思是“此处的任何地方”,而不仅仅是直接子级。

我认为您将通过以下XPath查询获得更多的运气:"/Book/bookObjects/pagesList"