c# - VB 到 C# - 无法读取 XML

标签 c# vb.net xml-parsing

第一个 block 中的 VB 代码运行良好,并且按照其说明执行操作,但是,我现在正在将其转换为 C#,并且我一辈子都无法弄清楚它是怎么回事。

我尝试运行 C#,但是,我注意到组合框 2 没有填充。经过进一步挖掘,我发现我的语句 name = xxxxxx 实际上没有返回任何内容。

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    ComboBox2.DataSource = null
    ComboBox2.Items.Clear()
    ComboBox2.Text = ""
    Dim name =
        From nm In xelement.Elements("Version")
        Where CStr(nm.Element("Trunk")) = ComboBox1.Text
        Select nm

    For Each xEle As XElement In name
        Dim branches = xEle.Elements("Branch").ToDictionary(
           Function(k) If(String.IsNullOrEmpty(k.Value), k.Attribute("Name").Value, k.Value),
           Function(v) If(v.Attribute("Path") Is Nothing, "", v.Attribute("Path").Value))

        Console.WriteLine(xEle)
        ComboBox2.DataSource = New BindingSource(branches, Nothing)
        ComboBox2.DisplayMember = "Key"
        ComboBox2.ValueMember = "Value"
    Next
End Sub

private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    ComboBox2.DataSource = @null;
    ComboBox2.Items.Clear();
    ComboBox2.Text = "";
    var name = from nm in xelement.Elements("Version")
               where System.Convert.ToString(nm.Element("Trunk")) == ComboBox1.Text
               select nm;

    foreach (XElement xEle in name)
    {
        var branches = xEle.Elements("Branch").ToDictionary(k => string.IsNullOrEmpty(k.Value) ? k.Attribute("Name").Value : k.Value, v => v.Attribute("Path") == null ? "" : v.Attribute("Path").Value);

        Console.WriteLine(xEle);
        ComboBox2.DataSource = new BindingSource(branches, null);
        ComboBox2.DisplayMember = "Key";
        ComboBox2.ValueMember = "Value";
    }
}

xml 摘录

<Version>
        <Trunk>Software Version 7.2</Trunk>
            <Branch Name=".24777 (Internal)" Path="T:\2014\Product\xxxxxxxxx\Internal\Internal"/>
             <Trunk>Software Version 7.4</Trunk>
        <Branch Name=".103 (Internal)" Path="T:\2015\Product\xxxxxxx\ Internal\Internal"/>

最佳答案

VB.NET 可能正在使用 CStr 进行“智能”转换上XElement检索值。

编辑:感谢TnTinMn指出这是由于 explicit operatorXElement返回element.Value当转换到 string 时通过CStr

enter image description here

在 C# 转换中,调用 System.Convert.ToString()行为有很大不同。它首先检查 IConvertible/IFormattable实现,如果这些不存在将调用 .ToString()在传入的对象上。因为这在 XElement 上没有重载,结果将是运行时类型的完全限定名称(在本例中为 "System.Xml.Linq.XElement" )。

因此,在 C# 中,您需要将比较更改为 .Value :

var name = from nm in xelement.Elements("Version")
           where nm.Element("Trunk").Value == ComboBox1.Text
           select nm;

或者进一步了解explicit operator ,转换为字符串:

var name = from nm in xelement.Elements("Version")
           where (string)nm.Element("Trunk") == ComboBox1.Text
           select nm;

不幸的是,我所做的重构的很大一部分是在 VB.NET 代码库中进行的,令人惊讶的是,幕后可能潜藏着如此多的小问题。

关于c# - VB 到 C# - 无法读取 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52084453/

相关文章:

c# - 看不到 system.io.ports

c# - 如何在 C# 中不使用 DIRECT SHOW 从网络摄像头获取 YUV 视频数据流?

jquery - AJAX 调用每次调用时都会将自身增加 +1

java - XML 解析器在 java 中获取名称和值对的结果

java - Android XML解析: Parse this special Type of XML i have no Idia about this

c# - C#中如何从数据库获取数据并将其放入变量中?

c# - 使用 ServiceStack + 自定义序列化替换遗留系统并创建新的服务器代码

mysql - 命令文本参数为空

asp.net - 如果内联 eval 不是什么,则连接

php - 您如何在PHP中解析和处理HTML/XML?