在 xml 文件中的特定节点后插入节点
inserting a node after a specific node in xml file
我将以更简单的方式重新发布我的问题。
我需要在 XML 文件中搜索特定节点,一旦我看到它,我需要创建一个新节点并在之后插入它。问题是有 2 个节点具有相同的值。我需要在每个实例之后插入两次新节点。使用以下代码:它两次插入新节点,但仅在第一个实例之后插入同一位置。
原版XML:
<eventlist>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd1" />
<media mediaType="Audio" />
</properties>
</event>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd2" />
<media mediaType="Audio" />
</properties>
</event>
</eventlist>
打算XML:
<eventlist>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd1" />
<media mediaType="Audio" />
</properties>
</event>
<event type="VIZ" />
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd2" />
<media mediaType="Audio" />
</properties>
</event>
<event type="VIZ" />
</eventlist>
但当前输出是:
<eventlist>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd1" />
<media mediaType="Audio" />
</properties>
</event>
<event type="VIZ" />
<event type="VIZ" />
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd2" />
<media mediaType="Audio" />
</properties>
</event>
</eventlist>
代码如下:
XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"C:\Users\namokhtar\Desktop\newxml\testxml.xml");
foreach (XmlNode node in xdoc.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']"))
{
XmlNode srcNode = node.SelectSingleNode("/eventlist/event[@type='AUDIOPLAYER']");
XmlNode newElem = xdoc.CreateElement("event");
XmlAttribute newAttr = xdoc.CreateAttribute("type");
newAttr.Value = "VIZ";
newElem.Attributes.Append(newAttr);
srcNode.ParentNode.InsertAfter(newElem, srcNode);
}
xdoc.Save(@"C:\Users\namokhtar\Desktop\newxml\newxml1.xml");
请多多指教...
我还没有完全测试过这个,但我几乎可以肯定这应该可以解决问题:
foreach (XmlNode node in xdoc.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']"))
{
XmlNodeList srcNodes = node.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']");
foreach (XmlNode srcNode in srcNodes)
{
XmlNode newElem = xdoc.CreateElement("event");
XmlAttribute newAttr = xdoc.CreateAttribute("type");
newAttr.Value = "VIZ";
newElem.Attributes.Append(newAttr);
srcNode.ParentNode.InsertAfter(newElem, srcNode);
}
}
问题是您 select 从匹配表达式创建单个节点,您需要 select 所有匹配的节点并在每个节点之后插入新节点。
希望对您有所帮助!
这是一个使用 LINQ 的解决方案:
var xml = XDocument.Parse(File.ReadAllText(@"C:\Users\namokhtar\Desktop\newxml\testxml.xml"));
var elems = xml.Root.Elements()
.Where(e => e.Name == "event" && e.Attribute("type")?.Value == "AUDIOPLAYER");
foreach (var elem in elems)
{
elem.AddAfterSelf(new XElement("event", new XAttribute("type", "VIZ")));
}
xml.Save(@"C:\Users\namokhtar\Desktop\newxml\newxml1.xml");
我将以更简单的方式重新发布我的问题。
我需要在 XML 文件中搜索特定节点,一旦我看到它,我需要创建一个新节点并在之后插入它。问题是有 2 个节点具有相同的值。我需要在每个实例之后插入两次新节点。使用以下代码:它两次插入新节点,但仅在第一个实例之后插入同一位置。
原版XML:
<eventlist>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd1" />
<media mediaType="Audio" />
</properties>
</event>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd2" />
<media mediaType="Audio" />
</properties>
</event>
</eventlist>
打算XML:
<eventlist>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd1" />
<media mediaType="Audio" />
</properties>
</event>
<event type="VIZ" />
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd2" />
<media mediaType="Audio" />
</properties>
</event>
<event type="VIZ" />
</eventlist>
但当前输出是:
<eventlist>
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd1" />
<media mediaType="Audio" />
</properties>
</event>
<event type="VIZ" />
<event type="VIZ" />
<event type="AUDIOPLAYER">
<properties>
<schedule startType="-ParentEnd2" />
<media mediaType="Audio" />
</properties>
</event>
</eventlist>
代码如下:
XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"C:\Users\namokhtar\Desktop\newxml\testxml.xml");
foreach (XmlNode node in xdoc.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']"))
{
XmlNode srcNode = node.SelectSingleNode("/eventlist/event[@type='AUDIOPLAYER']");
XmlNode newElem = xdoc.CreateElement("event");
XmlAttribute newAttr = xdoc.CreateAttribute("type");
newAttr.Value = "VIZ";
newElem.Attributes.Append(newAttr);
srcNode.ParentNode.InsertAfter(newElem, srcNode);
}
xdoc.Save(@"C:\Users\namokhtar\Desktop\newxml\newxml1.xml");
请多多指教...
我还没有完全测试过这个,但我几乎可以肯定这应该可以解决问题:
foreach (XmlNode node in xdoc.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']"))
{
XmlNodeList srcNodes = node.SelectNodes("/eventlist/event[@type='AUDIOPLAYER']");
foreach (XmlNode srcNode in srcNodes)
{
XmlNode newElem = xdoc.CreateElement("event");
XmlAttribute newAttr = xdoc.CreateAttribute("type");
newAttr.Value = "VIZ";
newElem.Attributes.Append(newAttr);
srcNode.ParentNode.InsertAfter(newElem, srcNode);
}
}
问题是您 select 从匹配表达式创建单个节点,您需要 select 所有匹配的节点并在每个节点之后插入新节点。
希望对您有所帮助!
这是一个使用 LINQ 的解决方案:
var xml = XDocument.Parse(File.ReadAllText(@"C:\Users\namokhtar\Desktop\newxml\testxml.xml"));
var elems = xml.Root.Elements()
.Where(e => e.Name == "event" && e.Attribute("type")?.Value == "AUDIOPLAYER");
foreach (var elem in elems)
{
elem.AddAfterSelf(new XElement("event", new XAttribute("type", "VIZ")));
}
xml.Save(@"C:\Users\namokhtar\Desktop\newxml\newxml1.xml");