【问题标题】:How to insert a child tag using XDocument and XElement?如何使用 XDocument 和 XElement 插入子标签?
【发布时间】:2021-02-13 23:27:06
【问题描述】:

我有这个 xml 架构,我需要将子标签添加到:

<?xml version="1.0" encoding="utf-8"?>
<PFA>
  <Entity id="123" action="add" date="04-Nov-2017"></Entity>
  <Entity id="125" action="add" date="05-Nov-2017"></Entity>
</PFA>

预期的结果是:

<?xml version="1.0" encoding="utf-8"?>
<PFA>
  <Record>
  <Entity id="123" action="add" date="04-Nov-2017"></Entity>
  <Entity id="125" action="add" date="05-Nov-2017"></Entity>
  </Record>
</PFA>

我已尝试使用此代码:

var doc = XDocument.Load("data.xml");
var record = new XElement("Record");
doc.Element("PFA").Add(record);
doc.Save("data.xml");

但我的结果如下。它有结束标签,但缺少开始标签。

<?xml version="1.0" encoding="utf-8"?>
<PFA>
  <Entity id="123" action="add" date="04-Nov-2017">
   
  </Entity>
  </Record>
</PFA>

更新:

我用Elements尝试了这个解决方案:

var doc = XDocument.Load(file.FullName);
var record = new XElement("Record");
var pfa = doc.Element("PFA");
var entities = pfa.Elements("Entity");
entities.Remove();    // remove <Entity> from <PFA>
pfa.Add(record);    // add <Record> to <PFA>
record.Add(entities); // add <Entity> to <Record>
doc.Save(file.FullName);

但仍然缺少开始记录标签,

输出变为:

<?xml version="1.0" encoding="utf-8"?>
<PFA>
  <Record />
</PFA>

如果我使用Element

var doc = XDocument.Load(file.FullName);
var record = new XElement("Record");
var pfa = doc.Element("PFA");
var entities = pfa.Element("Entity");
entities.Remove();    // remove <Entity> from <PFA>
pfa.Add(record);    // add <Record> to <PFA>
record.Add(entities); // add <Entity> to <Record>
doc.Save(file.FullName);

输出变成:

<?xml version="1.0" encoding="utf-8"?>
<PFA>
  <Entity id="123" action="add" date="04-Nov-2017"></Entity></Record>
  <Record><Entity id="123" action="add" date="04-Nov-2017"></Entity></Record>
  <Record><Entity id="125" action="add" date="05-Nov-2017"></Entity></Record>
</PFA>

【问题讨论】:

  • 您发布的代码不会创建这个无效的 XML。相反,它会创建一个有效的&lt;Record /&gt; 标签。你确定那是你当前得到的 XML 吗?

标签: c# xml xelement


【解决方案1】:

解决方案其实很简单。您从PFA 标记中删除Entity 标记,然后将新的Record 标记添加到PFA 标记并将Entity 标记读取到新添加的Record 标记。代码可能如下所示:

var pfa = doc.Element("PFA");
IList<XElement> entities = pfa.Elements("Entity").ToList();
foreach (var entity in entities)
{
    entity.Remove(); // Remove all the <Entity> tags from <PFA>
}
var record = new XElement("Record");
pfa.Add(record); // Add the new <Record>
foreach (var entity in entities) 
{
    record.Add(entity); // Add the <Entity> tags back to <Record>
}

【讨论】:

  • 有没有办法在不删除实体标签的情况下做到这一点?因为实际文件在 PFA 标签内有 20 多个其他标签
  • 您可以使用Elements() 而不是Element() 来获取一个元素的所有子元素,请参阅docs.microsoft.com/en-us/dotnet/api/…。您无需通过每个单独的名称来识别它们。
  • 我尝试了Elements(),但仍然无法获得预期的结果。当我调试它时,在pfa.Add(record) 期间,我只能看到记录的结束标记。不知道为什么。顺便说一句,我已经更新了预期的结果架构。
  • @Steve 检查我的更新,我已将其更改为使用Elements() 来获取元素的所有子元素。您可以使用它“断开”所有Entity 元素,然后添加新的Record,然后将所有Entity 元素读取到新的Record 元素中。
猜你喜欢
  • 2012-11-07
  • 2010-10-21
  • 2014-08-27
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多