我试图
加载外部xml
仅选择" oldName"节点
更改" oldName"节点到" newName"节点
创建并保存新的xml文件
以下代码不起作用,它只会创建"项目"节点
// Load xml
XElement doc = XElement.Load("http://.../file.xml");
var nodes = doc.Descendants().Where(element => element.Name.LocalName.Equals("oldName"));
foreach (var element in nodes)
{
if (element.Name.LocalName.Equals("oldName"))
{
element.Name = "newName";
}
}
XElement newDoc = new XElement("item", nodes);
// Save xml
newDoc.Save("C:/newFile.xml");
任何帮助都将不胜感激。
编辑:选择" oldName"节点工作,但我也需要重命名它们。
// Load xml
XElement doc = XElement.Load("http://.../file.xml");
var nodes = doc.Descendants().Where(element => element.Name.LocalName.Equals("oldName"));
XElement newDoc = new XElement("item", nodes);
// Save xml
newDoc.Save("C:/newFile.xml");
编辑:添加了文件示例
file.xml
<ignoreThisElement>
<oldName>
...
</oldName>
</ignoreThisElement>
newFile.xml
<newName>
...
</newName>
答案 0 :(得分:0)
您可以尝试这样的事情
// Load the xml
var doc = XDocument.Load("http://.../file.xml");
// loop thru the element an d search for a specific node and change the name
foreach (var element in doc.Descendants())
{
if (element.Name.LocalName.StartsWith("oldName"))
{
element.Name = "newName";
}
}
// Save xml
doc.Save("C:/newFile.xml");
答案 1 :(得分:0)
请尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication3
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XElement doc = XElement.Load(FILENAME);
List<XElement> nodes = doc.Descendants().Where(element => element.Name.LocalName.Equals("oldName")).ToList();
for(int index = nodes.Count() - 1; index >= 0; index--)
{
XElement node = nodes[index];
node.ReplaceWith(new XElement("newName", node.Descendants()));
}
}
}
}
答案 2 :(得分:0)
您的代码只会创建一个空的&#34;项目&#34;节点是因为节点&#39; var不再包含具有旧名称的元素。您已将所有元素更改为新变量,但linq查询仍引用旧名称。
// Load xml
XElement doc = XElement.Load("http://.../file.xml");
//using linq to get all nodes with name 'oldName'
var nodes = doc.Descendants().Where(element => element.Name.LocalName.Equals("oldName"));
//you rename the nodes here, so the linq query no longer finds nodes with 'oldName'
foreach (var element in nodes)
{
if (element.Name.LocalName.Equals("oldName"))
{
element.Name = "newName";
}
}
//result is 'items' node with no children
XElement newDoc = new XElement("item", nodes);
// Save xml
newDoc.Save("C:/newFile.xml");
解决方案是首先提取所需的节点,然后将它们移动到newDoc元素。此后,您可以重命名节点:
// Load xml
XElement doc = XElement.Load("http://.../file.xml");
var nodes = doc.Descendants().Where(element => element.Name.LocalName.Equals("oldName"));
//move the extracted old nodes to your newDoc first
XElement newDoc = new XElement("item", nodes);
//now rename
foreach (var element in newDoc.Descendants())
{
if (element.Name.LocalName.StartsWith("oldName"))
{
element.Name = "newName";
}
}
// Save xml
newDoc.Save("C:/newFile.xml");
或者,您可以在重命名后重新查询新节点名称的doc变量:
// Load xml
XElement doc = XElement.Load("http://.../file.xml");
//using linq to get all nodes with name 'oldName'
var nodes = doc.Descendants().Where(element => element.Name.LocalName.Equals("oldName"));
foreach (var element in nodes)
{
if (element.Name.LocalName.Equals("oldName"))
{
element.Name = "newName";
}
}
//get all newName nodes
var newNodes = doc.Descendants().Where(element => element.Name.LocalName.Equals("newName"));
XElement newDoc = new XElement("item", newNodes);
// Save xml
newDoc.Save("C:/newFile.xml");