XML:如何将一个文件读入另一个文件

时间:2011-04-27 20:57:50

标签: c# xml xquery xlink

我有一个文件:A.xml包含这样的内容:

<?xml version="1.0"?>
<headernode>

</headernode>

在headernode内部,我需要能够动态加载另一个名为B.xml的xml文件的内容,其中包含以下内容

<?xml version="1.0"?>
<token>
<a>0</a>
</token>

我的问题是如何在a.xml的头节点中获取B.xml的内容?

谢谢!

6 个答案:

答案 0 :(得分:3)

这似乎有效:

var header = XDocument.Load("a.xml");
var token = XElement.Load("b.xml");

var headerNode = header.Elements("headernode").First();
headerNode.Add(token);

Console.WriteLine(header.ToString()); 
/*
The above prints:

<headernode>
  <token>
    <a>0</a>
  </token>
</headernode>
*/

答案 1 :(得分:2)

如果你可以使用Linq to XML,这将相对简单:

XDocument doc1 = XDocument.Load("a.xml");
XDocument doc2 = XDocument.Load("b.xml");

doc1.Element("headernode").Add(doc2.Root);

答案 2 :(得分:2)

我更喜欢其他一些答案,但这是我想到的第一件事:

var a = new XmlDocument();
a.Load("c:\\a.xml");
var b = new XmlDocument();
b.Load("c:\\b.xml");
var node = a.SelectSingleNode("/headernode");
node.AppendChild(a.ImportNode(b.SelectSingleNode("/token"), true));
a.Save("c:\\c.xml"); 

答案 3 :(得分:2)

这个XQuery:

declare function local:copy-append($element as element()) {
   if ($element instance of element(headernode))
   then
      element headernode {$element/@*,doc('B.xml')}
   else
      element {node-name($element)}
         {$element/@*,
          for $child in $element/node()
          return if ($child instance of element())
                 then local:copy-append($child)
                 else $child
         }
};
local:copy-append(/*)

输出:

<headernode>
    <token>
        <a>0</a>
    </token>
</headernode>

答案 4 :(得分:0)

好吧,我不知道C-Sharp的确切方法, 但基本上不是

的默认方法
  1. 加载A.xml的DOM
  2. 找到headernode
  3. 将B.xml加载到DOM
  4. 为B
  5. 解析DOM的根目录
  6. 从DOM B复制root
  7. 把它作为孩子到位于DOM A的headernode
  8. 将修改后的DOM A重写为文件或任意内容 ?
  9. 由于我是Java开发人员,我对C-Sharp XML API不是很熟悉,但基本上我在那里看过XMLDocument和XDocument。当我没有错的时候,XDocument更新更简单,但两者都应该以某种方式做到。

    这有帮助吗?

答案 5 :(得分:0)

//myXmlToInsert.xml
/*
<?xml version="1.0"?>
<root>
  <child1></child1>
  <child2></child2>
  <token>
      <a>0</a>
  </token>
</root>
*/

//code
XDocument xmlDoc = new XDocument();
xmlDoc.Declaration = new XDeclaration("1.0", "utf-8", "yes");
xmlDoc.Document.Add(new XElement("rootNode",new XElement("headerNode"), new XElement("bodyNode")));
XDocument xmlToInsert = XDocument.Load(@"c:\myXmlToInsert.xml");
XElement tokenNode = xmlToInsert.Root.Element("token");

xmlDoc.Root.Element("headerNode").Add(tokenNode);    

//Result 
/*
<?xml version="1.0"?>
<root>
  <headerNode>
    <token>
       <a>0</a>
    </token>
   </headerNode>
   <bodyNode>
   </bodyNode>
</root>
*/