如何将特定父节点的每个子节点放入其自己的父节点
How to place every child node from a specific parent node into its own parent node
我有一个问题。
我有以下 XML 输入:
<root>
<name>Dennis</name>
<lastname>Some Lastname</lastname>
<age>28</age>
<hobbys>
<hobby>test1</hobby>
<hobby>test2</hobbyy>
<hobby>test3</hobby>
</hobbys>
<food>pizza</food>
<name>Bob</name>
<lastname>Some Lastname</lastname>
<age>48</age>
<hobbys>
<hobby>test4</hobby>
<hobby>test5</hobbyy>
<hobby>test6</hobby>
<hobby>test7</hobby>
<hobby>test8</hobby>
</hobbys>
<food>fries</food>
<footerText>blablabla</footerText>
</root>
并希望将特定节点的每个子节点放入其自己的父节点(在这种情况下,我希望所有子节点都有一个父节点,因此所需的输出将是:
<root>
<name>Dennis</name>
<lastname>Some Lastname</lastname>
<age>28</age>
<hobbys>
<hobby>test1</hobby>
</hobbys>
<hobbys>
<hobby>test2</hobby>
</hobbys>
<hobbys>
<hobby>test3</hobby>
</hobbys>
<food>pizza</food>
<name>Bob</name>
<lastname>Some Lastname</lastname>
<age>48</age>
<hobbys>
<hobby>test4</hobby>
</hobbys>
<hobbys>
<hobby>test5</hobby>
</hobbys>
<hobbys>
<hobby>test6</hobby>
</hobbys>
<hobbys>
<hobby>test7</hobby>
</hobbys>
<hobbys>
<hobby>test8</hobby>
</hobbys>
<food>fries</food>
<footerText>blablabla</footerText>
</root>
获得所需结果的最简单方法是什么?
我尝试了以下方法:
var xmlStr = [XML STRING];
xmlDoc.LoadXml(xmlStr);
xmlDoc.FirstChild.InnerXml = string.Join("",
xmlDoc.SelectNodes("//hobby")
.Cast<XmlNode>()
.Select(n => n.OuterXml));
XmlElement elem;
foreach (XmlElement node in xmlDoc.SelectNodes("//root//hobby"))
{
xmlDoc.FirstChild.RemoveChild(node);
elem = xmlDoc.CreateElement("hobbys");
elem.AppendChild(node);
xmlDoc.FirstChild.AppendChild(elem);
}
但这只有在有一份爱好列表时才有效,它不会记住它来自哪里。我有点卡住了,所以如果有人能帮助我,我将非常感激!
您好!
好吧,这是 xml 的一个有趣用法(xml 最重要的优点之一是可以正确地 parent/child 呈现数据),但您可以这样解决:
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(currentXML);
foreach (var currHobbysNode in xmlDoc.SelectNodes("//hobbys").Cast<XmlNode>())
{
foreach (var currHobbyNode in currHobbysNode.ChildNodes.Cast<XmlNode>())
{
//Create a new node.
var newHobbysElement = xmlDoc.CreateElement("hobbys");
var newHobbyElement = xmlDoc.CreateElement("hobby");
newHobbyElement.InnerText = currHobbyNode.InnerText;
newHobbysElement.AppendChild(newHobbyElement);
currHobbysNode.ParentNode.InsertBefore(newHobbysElement, currHobbysNode);
}
currHobbysNode.ParentNode.RemoveChild(currHobbysNode);
}
这似乎很明显,但这里发生的是我们循环每个 'hobbys' 节点并获取子节点,然后为每个 'hobby' 子节点创建新的 'hobbys' 节点。这是一个示例 fiddle https://dotnetfiddle.net/GSd86D
我有一个问题。
我有以下 XML 输入:
<root>
<name>Dennis</name>
<lastname>Some Lastname</lastname>
<age>28</age>
<hobbys>
<hobby>test1</hobby>
<hobby>test2</hobbyy>
<hobby>test3</hobby>
</hobbys>
<food>pizza</food>
<name>Bob</name>
<lastname>Some Lastname</lastname>
<age>48</age>
<hobbys>
<hobby>test4</hobby>
<hobby>test5</hobbyy>
<hobby>test6</hobby>
<hobby>test7</hobby>
<hobby>test8</hobby>
</hobbys>
<food>fries</food>
<footerText>blablabla</footerText>
</root>
并希望将特定节点的每个子节点放入其自己的父节点(在这种情况下,我希望所有子节点都有一个父节点,因此所需的输出将是:
<root>
<name>Dennis</name>
<lastname>Some Lastname</lastname>
<age>28</age>
<hobbys>
<hobby>test1</hobby>
</hobbys>
<hobbys>
<hobby>test2</hobby>
</hobbys>
<hobbys>
<hobby>test3</hobby>
</hobbys>
<food>pizza</food>
<name>Bob</name>
<lastname>Some Lastname</lastname>
<age>48</age>
<hobbys>
<hobby>test4</hobby>
</hobbys>
<hobbys>
<hobby>test5</hobby>
</hobbys>
<hobbys>
<hobby>test6</hobby>
</hobbys>
<hobbys>
<hobby>test7</hobby>
</hobbys>
<hobbys>
<hobby>test8</hobby>
</hobbys>
<food>fries</food>
<footerText>blablabla</footerText>
</root>
获得所需结果的最简单方法是什么? 我尝试了以下方法:
var xmlStr = [XML STRING];
xmlDoc.LoadXml(xmlStr);
xmlDoc.FirstChild.InnerXml = string.Join("",
xmlDoc.SelectNodes("//hobby")
.Cast<XmlNode>()
.Select(n => n.OuterXml));
XmlElement elem;
foreach (XmlElement node in xmlDoc.SelectNodes("//root//hobby"))
{
xmlDoc.FirstChild.RemoveChild(node);
elem = xmlDoc.CreateElement("hobbys");
elem.AppendChild(node);
xmlDoc.FirstChild.AppendChild(elem);
}
但这只有在有一份爱好列表时才有效,它不会记住它来自哪里。我有点卡住了,所以如果有人能帮助我,我将非常感激!
您好!
好吧,这是 xml 的一个有趣用法(xml 最重要的优点之一是可以正确地 parent/child 呈现数据),但您可以这样解决:
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(currentXML);
foreach (var currHobbysNode in xmlDoc.SelectNodes("//hobbys").Cast<XmlNode>())
{
foreach (var currHobbyNode in currHobbysNode.ChildNodes.Cast<XmlNode>())
{
//Create a new node.
var newHobbysElement = xmlDoc.CreateElement("hobbys");
var newHobbyElement = xmlDoc.CreateElement("hobby");
newHobbyElement.InnerText = currHobbyNode.InnerText;
newHobbysElement.AppendChild(newHobbyElement);
currHobbysNode.ParentNode.InsertBefore(newHobbysElement, currHobbysNode);
}
currHobbysNode.ParentNode.RemoveChild(currHobbysNode);
}
这似乎很明显,但这里发生的是我们循环每个 'hobbys' 节点并获取子节点,然后为每个 'hobby' 子节点创建新的 'hobbys' 节点。这是一个示例 fiddle https://dotnetfiddle.net/GSd86D