【问题标题】:How to recover all the XML elements in an XML tag?如何恢复 XML 标记中的所有 XML 元素?
【发布时间】:2016-07-29 12:48:09
【问题描述】:

这是我的 XML 示例:

        <Library>
            <Stack>
                <Book>
                    <Author>....</Author>
                    <Date>....</Date>
                </Book>
                <Book>
                    <Author>....</Author>
                    <Date>....</Date>
                </Book>
            </Stack>
            <Stack>
                <SectionScience>
                    <Book>
                        <Author>....</Author>
                        <Date>....</Date>
                    </Book>
                </SectionScience>
                <SectionHorror>
                    <Book>
                        <Author>....</Author>
                        <Date>....</Date>
                    </Book>
                </SectionHorror>
                <Book>
                    <Author>....</Author>
                    <Date>....</Date>
                </Book>
            </Stack>
        </Library>

我尝试实现一种方法来恢复所有这些信息,但它不起作用:它只恢复 Stack 中的一项,我希望它恢复堆栈中的所有元素。

我得到的是这样的:

堆栈 1:第一本书;

堆栈 2:第一节

这是我的代码:

 private void ConstructionInterface()
 {
   XElement docX = XElement.Load(Application.StartupPath + @"\Library.xml");
   foreach (XElement elemColone in docX.Descendants("Stack"))
     {
       if (elemColone.Element("SectionHorror") != null)
         CreateSectionHorror( elemColone.Element("SectionHorror"));
       else if (elemColone.Element("SectionScience") != null)
         CreateSectionScience( elemColone.Element("SectionScience"));
       else if (elemColone.Elements("Book") != null)
         CreateBook( elemColone.Element("Book"));
        }
    }

【问题讨论】:

  • 找到一个很好的使用xpath查询xml的教程。
  • 我注意到的第一件事是这不是有效的 xml(标签中不能有空格)。我注意到的第二件事是,您编写的代码对于每个 Stack 标记只能执行一个操作。
  • 是的,我明白,但我不知道如何实现一个不通过堆栈标签执行一项操作的算法
  • 是的,&lt;Section Horror&gt; 是无效的 XML。你可能想要更多的东西,是的,&lt;Section name="Horror"&gt; is invalid XML。

标签: c# xml xelement


【解决方案1】:

您还需要遍历每个Stack 的孩子:

foreach (XElement elemColone in docX.Descendants("Stack"))
{
    foreach (var sectionOrBook in elemColone.Elements())
    {
        if (sectionOrBook.Name == "SectionHorror")
            CreateSectionHorror(sectionOrBook);
        else if (sectionOrBook.Name == "SectionScience")
            CreateSectionScience(sectionOrBook);
        else if (sectionOrBook.Name == "Book")
            CreateBook(sectionOrBook);
    }
}

【讨论】:

    【解决方案2】:

    不清楚“恢复”是什么意思,但如果它意味着创建现有 XML 的副本,那么在 VB 中使用 XElement 就可以了

        Dim xe As XElement
        'to load from a file
        '  xe = XElement.Load("Your Path Here")
    
        ' for testing
        xe =
            <Library>
                <Stack>
                    <Book>
                        <Author>....</Author>
                        <Date>....</Date>
                    </Book>
                    <Book>
                        <Author>....</Author>
                        <Date>....</Date>
                    </Book>
                </Stack>
                <Stack>
                    <SectionScience>
                        <Book>
                            <Author>....</Author>
                            <Date>....</Date>
                        </Book>
                    </SectionScience>
                    <SectionHorror>
                        <Book>
                            <Author>....</Author>
                            <Date>....</Date>
                        </Book>
                    </SectionHorror>
                    <Book>
                        <Author>....</Author>
                        <Date>....</Date>
                    </Book>
                </Stack>
            </Library>
    
        Dim recover As XElement = New XElement(xe) ' this line creates a copy
    
        '  recover.Save("path here")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      相关资源
      最近更新 更多