Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中使用标记内的属性生成XML#_C#_Xml_Sqlite - Fatal编程技术网

C# 在c中使用标记内的属性生成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

我有以下XML结构

<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>