VB转C#-无法读取XML

时间:2018-08-29 19:03:44

标签: c# vb.net xml-parsing

第一个块中的VB代码可以正常工作,并且可以按照其提示进行操作,但是,我现在将其转换为C#,无法终生解决。

我尝试运行C#,但是,我注意到combobox2没有填充。在进一步挖掘时,我发现我的语句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"/>

1 个答案:

答案 0 :(得分:2)

VB.NET可能正在CStr上的XElement进行“智能”转换,以获取值

编辑:感谢TnTinMn指出,这是由于XElement上的explicit operator通过{{1转换为element.Value时返回string }}。

enter image description here

在C#转换中,CStr的调用行为大不相同。它首先检查System.Convert.ToString()的实现,如果不存在,将在传入的对象上调用IConvertible/IFormattable。由于在.ToString()上没有重载,因此结果将是运行时类型的限定名称(在这种情况下为XElement)。

因此,在C#中,您需要将比较更改为"System.Xml.Linq.XElement"

.Value

或进一步了解var name = from nm in xelement.Elements("Version") where nm.Element("Trunk").Value == ComboBox1.Text select nm; ,将其强制转换为字符串:

explicit operator

不幸的是,我所做的很大一部分重构工作是在VB.NET代码库中进行的,令人惊讶的是,有多少这样的小问题会潜伏在幕后。