【问题标题】:C# convert unknown XML string as treeC# 将未知的 XML 字符串转换为树
【发布时间】:2018-03-13 21:32:51
【问题描述】:

我正在尝试将 XML 文件(我不知道哪些内容/结构)转换为自定义树。 树有一个如下形式的构造函数:

InformationNode(String key, String value, 'enum' type).

InformationNode 有一个addChild 功能,没有child 数量限制。我目前的代码如下:

public static InformationNode fromXML(String xml)
    {
        xml = xml.Replace("< ", "<").Replace("</ ", "</"); //Bugfix for some API's.
        XDocument xdoc = XDocument.Parse(xml);
        var details = xdoc.Root.Elements();
        String key = "->";

        InformationNode node = new InformationNode(key, "", InformationType.Object);
        foreach (var detail in details)
        {
            //If XML is Leaf.
            if (details.Count() == 0 && int.TryParse(detail.Value.Trim().ToString(), out var n))
                 return new InformationNode(key, detail.Value.Trim().ToString(), InformationType.Int);
            if (details.Count() == 0)
                 return new InformationNode(key, detail.Value.Trim().ToString(), InformationType.String);
            //If XML is object:
            node.addChild(fromXML(detail.Value.Trim()));                
        }
        return node;
    }

但不幸的是,返回了一个空节点。 谁能告诉我我做错了什么?

编辑: 根据要求:2 个测试用例。

InformationNode a = InformationNode.fromXML("<stationcode> 6391 </ stationcode >"); 
InformationNode b =  InformationNode.fromXML("<?xml version=\"1.0\" encoding=\"utf - 8\" ?><weerstation id=\"6391\"><stationcode> 6391 </ stationcode >< stationnaam regio = \"Venlo\" > Meetstation Arcen </ stationnaam >< lat > 51.50 </ lat >< lon > 6.20 </ lon >< datum > 09 / 28 / 2017 20:20:00 </ datum >< luchtvochtigheid > 80 </ luchtvochtigheid >< temperatuurGC > 18.7 </ temperatuurGC >< windsnelheidMS > 3.5 </ windsnelheidMS >< windsnelheidBF > 3 </ windsnelheidBF >< windrichtingGR > 207 </ windrichtingGR >< windrichting > ZZW </ windrichting >< luchtdruk > -</ luchtdruk >< zichtmeters > -</ zichtmeters >< windstotenMS > 6.4 </ windstotenMS >< regenMMPU > -</ regenMMPU >< zonintensiteitWM2 > -</ zonintensiteitWM2 >< icoonactueel ID = \"cc\" zin = \"Zwaar bewolkt\" >https://www.buienradar.nl/resources/images/icons/weather/30x30/cc.png</ icoonactueel >< temperatuur10cm > 18.2 </ temperatuur10cm >< url >http://www.buienradar.nl/nederland/weerbericht/weergrafieken/6391</ url >< latGraden > 51.83 </ latGraden >< lonGraden > 6.33 </ lonGraden ></ weerstation > ");

【问题讨论】:

  • 不确定,但我认为this 将帮助您从 XML 字符串构建树。
  • 提供一个简化但完整的示例来重现您的问题,以便我们自己重现它。排除所有不必要的细节。
  • 您是否尝试过单步执行代码以找出问题所在?您可以使用即时窗口执行语句以找出违规的位置。
  • 如果 details.count 等于 0,那么将没有要 foreach 的细节。也许这些应该发生在 foreach 之前?
  • @dcg 知道它将接收什么 XML 文件,这不是我的目的,我希望能够转换 any XML 文件

标签: c# asp.net .net xml asp.net-mvc


【解决方案1】:

根据您似乎正在尝试做的事情,我认为这就是您所追求的:

public static InformationNode fromXML(String xml)
{
    xml = xml.Replace("< ", "<").Replace("</ ", "</"); //Bugfix for some API's.
    var xdoc = XDocument.Parse(xml);
    var details = xdoc.Root.Elements();
    var key = "->";

    var node = new InformationNode(key, "", InformationType.Object);

    // Do we have any child nodes?
    if(details != null && details.Any())
    {
        foreach (var detail in details)
        {
            //If XML is object, recurse:
            node.addChild(fromXML(detail.ToString()));                
        }
    }
    else
    {
        // No child nodes - try to read the current element's value
        var rootValue = xdoc.Root.Value.Trim();

        //If XML is Leaf.
        if (int.TryParse(rootValue, out var n))
        {
            node = InformationNode(key, rootValue, InformationType.Int);
        }
        else
        {
            node = InformationNode(key, rootValue, InformationType.String);
        }
    }

    return node;
}

XDocument.Root 是一个XElement,所以如果它没有子元素,你可以读取它的值。您可能想要添加对空字符串或空字符串的检查。

如果可能的话,我也更喜欢在给定的方法中只有一个退出点,所以我稍微更新了解析部分。

这是未经测试的,除非您计划提供InformationNode 等的实现。

【讨论】:

  • 谢谢,第一次递归时它仍然返回错误(XmlException:根级别的数据无效。第 1 行,位置 1。)但至少我感觉它现在做了一些事情。
  • 我发现了递归问题,“detail.Value”被剥离了所有的 xml 标签,通过用“detail.ToString()”替换它,我的问题得到了解决。非常感谢您的帮助!
猜你喜欢
  • 2017-06-20
  • 1970-01-01
  • 2021-12-01
  • 2018-11-27
  • 2011-09-03
  • 2015-05-08
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多