C# 在c中使用标记内的属性生成XML#
我有以下XML结构C# 在c中使用标记内的属性生成XML#,c#,xml,sqlite,C#,Xml,Sqlite,我有以下XML结构 <a> <b> <c> <d>54</d> <e>US</e> <f>Canada</f> <g> <h> <i1>39</i1> <i2>Belg
<a>
<b>
<c>
<d>54</d>
<e>US</e>
<f>Canada</f>
<g>
<h>
<i1>39</i1>
<i2>Belgium</i2>
<i3>Russia</i3>
</h>
<h>
<i1>43</i1>
<i2>Fran</i2>
<i3>Ger</i3>
</h>
</g>
</c>
<c>
<d>5</d>
<e>US</e>
<f>Can</f>
<g>
<h>
<i1>29</i1>
<i2>Brit</i2>
<i3>Ice</i3>
</h>
<h>
<i1>95</i1>
<i2>Russia</i2>
<i3>Nero</i3>
</h>
<h>
<i1>4323</i1>
<i2>Polska</i2>
<i3>503</i3>
</h>
</g>
</c>
</b>
<b2>
<c2>
<d2>551</d2>
<d3>Indo</d3>
<e2>
<f2>
<g2>Irnna</g2>
<g3>Mehak</g3>
<g4>Vodka</g4>
<h2>
<i2>
<j1>44</j1>
<j6>Germ0</j6>
</i2>
<i21>Finish</i21>
</f2>
</e2>
<f3>544</f3>
<g3>fur</g3>
<h3>denmark</h3>
<k1>lur</k1>
<k2>Bern</k2>
<k3>Zurick</k3>
<k4>Italy</k4>
</c2>
</b2>
<b3>35</b3>
<b4>ferha</b4>
<b5>english</b5>
<b6>334</b6>
</a>
但是,我有错误。你能给我一些提示或纠正我代码中的错误吗?实际上,它一直工作到(上半年)。当结构在下半部分发生更改时,它会显示错误,如“对象引用未设置为对象的实例”、“重复属性”。你能告诉我我的方法是否正确吗?逻辑结构中有问题吗?您的示例输入XML文档缺少h2元素的结束标记。此外,输入XML文档中的值与预期输出XML中的值不匹配。也就是说,我使用了您的示例输入(添加了缺少的h2结束标记),并通过以下代码运行它:
XDocument xDoc = XDocument.Load("my.xml");
XElement[] elements = xDoc.DescendantNodes()
.Where(n => n.NodeType == XmlNodeType.Text).Select(n => n.Parent).ToArray();
foreach (XElement element in elements)
{
element.Parent.SetAttributeValue(element.Name, element.Value);
element.Remove();
}
结果是:
<a b3="35" b4="ferha" b5="english" b6="334">
<b>
<c d="54" e="US" f="Canada">
<g>
<h i1="39" i2="Belgium" i3="Russia" />
<h i1="43" i2="Fran" i3="Ger" />
</g>
</c>
<c d="5" e="US" f="Can">
<g>
<h i1="29" i2="Brit" i3="Ice" />
<h i1="95" i2="Russia" i3="Nero" />
<h i1="4323" i2="Polska" i3="503" />
</g>
</c>
</b>
<b2>
<c2 d2="551" d3="Indo" f3="544" g3="fur" h3="denmark" k1="lur" k2="Bern" k3="Zurick" k4="Italy">
<e2>
<f2 g2="Irnna" g3="Mehak" g4="Vodka">
<h2 i21="Finish">
<i2 j1="44" j6="Germ0" />
</h2>
</f2>
</e2>
</c2>
</b2>
</a>
这似乎是你一直在寻找的,但如果不是,也许代码可以为你指明正确的方向
我使用了LINQ方法语法,而不是您使用的查询语法,但我认为这一部分并不重要。然而,我注意到您正在寻找特定的元素,例如“a”或“g”,我想看看是否可以用更一般的方式来实现这一点
我在写这篇文章时也遇到了空引用异常。例如,我最初将
元素
变量作为IEnumerable
,但后来我将在foreach
中从其父元素中删除一个元素,并且在下一次迭代中将有一些LINQ延迟执行,因此它将返回到子代节点()
但是如果删除元素,它就不能正常工作,我会看到null引用异常。因此,我不是在LINQ下更改内容,而是ToArray()
集合,这样所有的执行都会立即发生,而我使用的是数组。我之所以提到这一切,是因为你可能也遇到过类似的事情。我想通过XSLT处理类似的事情会更好。你能给我一些适合我的结构的示例吗?不幸的是,可能不会比你花的时间更快。10年前,我可以用笔在餐巾纸上完成相当复杂的XSLT,但从那时起我就没有使用过它/我正试图弄明白,但如果您有更好的解决方案,请帮助我。无论如何,是否可以将此xml格式转换为数据库?你知道吗?@Imha不客气。当你说“是否可以将这种xml格式转换为数据库”时,我不太确定你在问什么,这可能意味着很多事情之一,尽管我猜答案是“可以”。我建议用一个新的问题来问这个问题,要有足够的细节说明你正在尝试做什么,当然要包括你已经尝试过的,以及你遇到的问题。这样,我们就站在同一个页面上,我们可以共同努力找到解决方案。
XDocument xDoc = XDocument.Load("my.xml");
XElement[] elements = xDoc.DescendantNodes()
.Where(n => n.NodeType == XmlNodeType.Text).Select(n => n.Parent).ToArray();
foreach (XElement element in elements)
{
element.Parent.SetAttributeValue(element.Name, element.Value);
element.Remove();
}
<a b3="35" b4="ferha" b5="english" b6="334">
<b>
<c d="54" e="US" f="Canada">
<g>
<h i1="39" i2="Belgium" i3="Russia" />
<h i1="43" i2="Fran" i3="Ger" />
</g>
</c>
<c d="5" e="US" f="Can">
<g>
<h i1="29" i2="Brit" i3="Ice" />
<h i1="95" i2="Russia" i3="Nero" />
<h i1="4323" i2="Polska" i3="503" />
</g>
</c>
</b>
<b2>
<c2 d2="551" d3="Indo" f3="544" g3="fur" h3="denmark" k1="lur" k2="Bern" k3="Zurick" k4="Italy">
<e2>
<f2 g2="Irnna" g3="Mehak" g4="Vodka">
<h2 i21="Finish">
<i2 j1="44" j6="Germ0" />
</h2>
</f2>
</e2>
</c2>
</b2>
</a>