【问题标题】:Problem with LINQ to XML and NamespacesLINQ to XML 和命名空间的问题
【发布时间】:2010-03-12 20:37:52
【问题描述】:

我在使用第三方 XML 字符串时遇到问题,该字符串包含带有 LINQ to XML 的命名空间。

在下面的代码中,一切正常。我可以选择 xElement (xEl1) 并更新它的值。

    'Example Without Namespace
    Dim XmlWithOutNs = _
    <?xml version="1.0"?>
    <RATABASECALC>
        <RATEREQUEST>
            <ANCHOR>
                <DATABASENAME>DatabaseName</DATABASENAME>
                <DATABASEPW>DatabasePw</DATABASEPW>
            </ANCHOR>
        </RATEREQUEST>
    </RATABASECALC>

    Dim xEl1 = XmlWithOutNs...<DATABASEPW>.FirstOrDefault
    If xEl1 IsNot Nothing Then
        xEl1.Value = "test"
    End If

但是,在下面的代码中,xElement (xEl2) 没有返回任何内容。唯一的区别是命名空间 (xmlns="http://www.cgi.com/Ratabase)

    'Example With Namespace
    Dim XmlWithNs = _
    <?xml version="1.0"?>
    <RATABASECALC xmlns="http://www.cgi.com/Ratabase">
        <RATEREQUEST>
            <ANCHOR>
                <DATABASENAME>DatabaseName</DATABASENAME>
                <DATABASEPW>DatabasePw</DATABASEPW>
            </ANCHOR>
        </RATEREQUEST>
    </RATABASECALC>

    Dim xEl2 = XmlWithNs...<DATABASEPW>.FirstOrDefault
    If xEl2 IsNot Nothing Then
        xEl2.Value = "test"
    End If

所以我的问题是: 1. 为什么会这样? 2. 我该如何解决这个问题?

【问题讨论】:

    标签: xml linq


    【解决方案1】:

    这不是编译成(用 C# 术语)的等价物:

    var el2 = XmlWithNs.Descendants("DATABASEPW").FirstOrDefault();
    

    在哪里获得“DATABASEPW”在正确的命名空间你需要相当于:

    XNamespace ns = "http://www.cgi.com/Ratabase";
    var el2 = XmlWithNs.Descendants(ns + "DATABASEPW").FirstOrDefault();
    

    翻译成VB,你应该设置好了吗?

    Reflector 向我保证(但不要引用我的话!)这是这样的:

    Dim ns As XNamespace = "http://www.cgi.com/Ratabase"
    Dim el2 As XElement = XmlWithNs.Descendants(ns + "DATABASEPW").FirstOrDefault
    

    【讨论】:

    • 这里是 VB 代码,如果你关心的话: Dim ns As XNamespace = "cgi.com/Ratabase" Dim xEl2 = XmlWithNs.Descendants(ns + "DATABASEPW").FirstOrDefault
    • 啊,那个更漂亮。我上一个 VB 是在 VB6 时代,我已经生锈了;-p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多