首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ to XML将XML文件插入到现有XML文件中

使用LINQ to XML将XML文件插入到现有XML文件中
EN

Stack Overflow用户
提问于 2012-12-14 07:30:07
回答 1查看 1.2K关注 0票数 0

使用一些example code I found here on SO,我编写了一些代码来打开一个现有的XML数据库,打开另一个要插入到第一个XML中的XML文件,获取该文件中根节点的后代,并将它们附加到database.xml文件中所选节点的基础上,然后将结果文件保存到一个新的XML文件中。下面的代码在VS2010中编译和运行没有错误,但是没有将actionID.xml文件中的XML添加到database.xml文件中,我不知道我错过了什么。

下面是C#代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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>

生成的文件应如下所示:

代码语言:javascript
复制
<?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>

我遗漏了什么或做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-14 07:40:29

错误在这里:

代码语言:javascript
复制
var actionXML = addAction.Root.Descendants("PCBDBActivityLog")` 

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

代码语言:javascript
复制
var actionXML = addAction.Descendants("PCBDBActivityLog");

代码语言:javascript
复制
var actionXML = addAction.Root;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13870395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档