【问题标题】:How to change from XDocument to XMLDocument Code?如何从 XDocument 更改为 XMLDocument 代码?
【发布时间】:2018-04-16 14:01:36
【问题描述】:

嘿,我有两个 xml 文件和以下代码:

        DataTable table = new DataTable();

        List<string> headingNames = new List<string>();
        List<string> valueNames = new List<string>();

        //first xml file
        XDocument config = XDocument.Load(configFile);

        Dictionary<string, string> dict = config.Descendants("Columns").FirstOrDefault().Elements()
            .GroupBy(x => (string)x.Attribute("XPath"), y => (string)y.Attribute("Name"))
            .ToDictionary(x => x.Key, y => y.FirstOrDefault());

        //second xml file
        XDocument data = XDocument.Load(dataFile);

        List<XElement> positions = data.Descendants("Position").ToList();

但我必须把它改成 XMLDocument 代码。

这里是第一个 XML:

<?xml version="1.0" encoding="utf-8"?>
<ROOT>
 <Columns BaseXPath="//Orders/Position/">
  <Colum XPath="@PositionSK" Name="Position"/>
  <Colum XPath="@PosGroup" Name="Gruppen-Nr"/>
  <Colum XPath="@PosNumber" Name="PositionsNr"/>
  <Colum XPath="@PositionCommercialTypeSK" Name="Status"/>
  <Colum XPath="@BundlePositionSK" Name="BundlePositionSK"/>
  <Colum XPath="@MainPositionSK" Name="MainPositionSK"/>
  <Colum XPath="@SalesAgentPrice" Name="Preis"/>
  <Colum XPath="@Catchword" Name="Suchwort"/> 
  <Colum XPath="@ContentComponentCommSK" Name="IKO"/>
  <Colum XPath="@PositionTypeSK" Name="PositionsTyp"/>
  <Colum XPath="//Advertisement[@AdvertisementSK = PositionAdvertisementRelationship/@AdvertisementSK]/@AdvertisementSK" Name="AdvertisementSK"/>
  <Colum XPath="//Advertisement[@AdvertisementSK = PositionAdvertisementRelationship/@AdvertisementSK]/@AdvertisementTypeSK" Name="Formatvorgabe"/>
 </Columns>
</ROOT>

我想要所有带有 @ 和“名称”的名称:Position、Gruppen-Nr、...

所以在 Dic 中(来自我的代码)是站在 {[@PositionSK, Position]}, {[@PosGroup, Gruppen-Nr]}, ...

那么如何使用 XMLDocument 达到相同的结果?

下一步我有:

        foreach (XElement position in positions.Where(e => e.HasAttributes))
        {
            valueNames.Clear();
            headingNames.Clear();

            foreach (XAttribute attribute in position.Attributes().Where(a => dict.ContainsKey($"@{a.Name.LocalName}")))
            {
                string name = attribute.Name.LocalName;
                string xName = dict["@" + name];
                string value = (string)attribute;

                headingNames.Add(xName);

                valueNames.Add(value);
            }

输出将是 DataGridView 上的 DataTable。 它应该在另一个 xml 文件中搜索带有 @ 的名称并找到它们的值。但是需要 XMLDocument 的代码.. 而不是 linq.. 有人能帮帮我吗?

【问题讨论】:

  • 你的代码有什么问题?为什么你的方法不起作用?
  • 它只是一个更大代码的小代码 sn-p.. 后来使用 XMLDocument 更容易,这就是为什么我想将这些代码更改为 XMLDocument,只需要一点帮助,如何到..

标签: c# winforms xmldocument


【解决方案1】:

一个基本的例子是:

List<string> valueNames = new List<string>();
List<string> headingNames = new List<string>();

XmlDocument doc = new XmlDocument();
doc.Load("data.xml");

for (int r = 0; r < doc.ChildNodes.Count; r++)
{
    var currentNode = doc.ChildNodes.Item(r);
    if (currentNode.Name.Equals("ROOT"))
    {
        var columnsNode = currentNode.FirstChild;

        for (int i = 0; i < columnsNode.ChildNodes.Count; i++)
        {
            XmlNode child = columnsNode.ChildNodes.Item(i);

            for (int j = 0; j < child.Attributes.Count; j++)
            {
                var attribute = child.Attributes.Item(j);
                if (attribute.Name.Equals("XPath"))
                {
                    headingNames.Add(attribute.Value);
                }
                else if (attribute.Name.Equals("Name"))
                {
                    valueNames.Add(attribute.Value);
                }
            }
        }
    }
}

一些解释:

  • 您的示例 XML 没有 XML 声明,因此我们可以通过访问 FirstChild 属性来获取根元素。

  • 编辑后:您的示例 XML 现在有一个 XML 声明,但模式是相同的。 For-Loop 和访问此循环的每个索引器的子元素。

  • “列”元素可以通过相同的方式到达。

  • 在“列”元素上,我们循环遍历所有子节点并使用循环的索引器 (i) 来获取相应的元素。为什么?因为它是一个XmlNodeList 对象。

  • 对于我们的XmlNode child,我们做同样的事情,但这次不是子节点。相反,我们遍历属性节点并寻找正确的名称。

【讨论】:

  • 啊,谢谢!但是我已经编辑了我的 XML,因为缺少第一行..所以它不适用于“FirstChild”..
  • @Lizzy 我希望你看到访问XmlDocument Elements 的模式。 For-Looping 并使用.Item(int index) 方法。
  • 是的,行得通:) 唯一的问题是,我必须在第二个 xml 文件中的值之后进行搜索。所以我有所有的名字,但没有他们的正确价值。在我的代码中,列表 positions 来自第二个 xml 文件。里面有所有的价值。我将编辑代码以向您展示我的意思。
  • @Lizzy 那将违反 StackOverflow 规则。一个问题,一个答案,没有编辑。请为更多读者标记答案。
  • 嗯,但在我的问题中,还有“价值”的部分,所以它不是第二个问题。 :D 但是谢谢你,然后我会把我的代码发给你。 :)
猜你喜欢
  • 1970-01-01
  • 2010-12-05
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2021-05-15
相关资源
最近更新 更多