0

使用我在 SO 上找到的一些示例代码,我整理了一些代码来打开现有的 XML 数据库,打开另一个要插入到第一个 XML 中的 XML 文件,获取根节点的后代文件,并将它们附加到 database.xml 文件中选定节点的基部,然后将生成的文件保存到新的 XML 文件中。下面的代码在 VS2010 中编译和运行没有错误,但没有将 actionID.xml 文件中的 XML 添加到 database.xml 文件中,我不知道我缺少什么。

这是 C# 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

class pcbdbUpdate
{
static void Main( )
    {
        //open database & load into memory
        XDocument PCBDB = XDocument.Load("C:\\database.xml");
        //open Activity Log file & load into memory
        XDocument addAction = XDocument.Load("C:\\actionID.xml");
        //get descendant node(s) below PCBDBActivityLog root node
        var actionXML = addAction.Root.Descendants("PCBDBActivityLog");
        /*supposed to write out child nodes, but not very useful, just tells me
        it's a:  System.Xml.Linq.XContainer+<GetDescendants>d__a*/
        Console.WriteLine(actionXML.ToString());
        //enumerate database for SBE_PCB_Data nodes
        IEnumerable<XElement> SBE_PCB_Data = PCBDB.Element("PCBDatabase").Elements("SBE_PCB_Data");
        //look for specific node with PCBID of "00001" and select it
        XElement newAction = SBE_PCB_Data.Where(p => p.Attribute("PCBID").Value == "00001").FirstOrDefault();
        //write descendants from Activity Log to base of node
        newAction.Add(actionXML);
        //save the resultant file
        PCBDB.Save("C:\\newDatabase.xml");
    }
}

这是database.xml:

<?xml version="1.0" encoding="utf-8"?>
<PCBDatabase>
  <SBE_PCB_Data PCBID="00001">
    <Creation ActionID="0002" User="DELLIOTTG:192.168.1.69" Date="2012-10-31T14:35:58" PCBID="00001">
      <PCBDrawing>00001a</PCBDrawing>
      <AssemblyDrawing>00001b</AssemblyDrawing>
      <Vendor>SBE</Vendor>
      <PONumber>00000</PONumber>
    </Creation>
    <Assignment ActionID="1295" User="RHO:192.168.1.6" Date="2012-12-13T08:59:31" PCBID="00001">
      <PCBDrawing>00002a</PCBDrawing>
      <AssemblyDrawing>00001c</AssemblyDrawing>
      <Vendor>SBE</Vendor>
      <PONumber>00001</PONumber>
    </Assignment>   
  </SBE_PCB_Data>
  <SBE_PCB_Data PCBID="00002">
    <Assignment ActionID="630c" User="DMUELLER:192.168.1.152" Date="2010-03-15T13:14:21" PCBID="00002">
      <SBEJobNumber>57380</SBEJobNumber>
    </Assignment>
  </SBE_PCB_Data>
</PCBDatabase>

这是 actionID.xml:

<?xml version="1.0"?>
<PCBDBActivityLog>
    <Assignment ActionID='8353' User='DMUELLER:192.168.1.134' Date='2011-01-27T15:38:25' PCBID='00001'>
        <SBEPN>41528E</SBEPN>
    </Assignment>
</PCBDBActivityLog>

生成的文件应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<PCBDatabase>
  <SBE_PCB_Data PCBID="00001">
    <Creation ActionID="0002" User="DELLIOTTG:192.168.1.69" Date="2012-10-31T14:35:58" PCBID="00001">
      <PCBDrawing>00001a</PCBDrawing>
      <AssemblyDrawing>00001b</AssemblyDrawing>
      <Vendor>SBE</Vendor>
      <PONumber>00000</PONumber>
    </Creation>
    <Assignment ActionID="1295" User="RHO:192.168.1.6" Date="2012-12-13T08:59:31" PCBID="00001">
      <PCBDrawing>00002a</PCBDrawing>
      <AssemblyDrawing>00001c</AssemblyDrawing>
      <Vendor>SBE</Vendor>
      <PONumber>00001</PONumber>
    </Assignment>
    <Assignment ActionID='8353' User='DMUELLER:192.168.1.134' Date='2011-01-27T15:38:25' PCBID='00001'>
        <SBEPN>41528E</SBEPN>
    </Assignment>
  </SBE_PCB_Data>
  <SBE_PCB_Data PCBID="00002">
    <Assignment ActionID="630c" User="DMUELLER:192.168.1.152" Date="2010-03-15T13:14:21" PCBID="00002">
      <SBEJobNumber>57380</SBEJobNumber>
    </Assignment>
  </SBE_PCB_Data>
</PCBDatabase>

我错过了什么或做错了什么?

4

1 回答 1

1

错误在这里:

var actionXML = addAction.Root.Descendants("PCBDBActivityLog")` 

您正在尝试<PCBDBActivityLog>在文档根目录下查找元素。但这不会返回任何内容,因为<PCBDBActivityLog>elementactionID.xml文档的根。将此行替换为

var actionXML = addAction.Descendants("PCBDBActivityLog");

或者

var actionXML = addAction.Root;
于 2012-12-13T23:40:28.950 回答