LINQ to XML和命名空间的问题

时间:2010-03-12 20:37:52

标签: xml linq

我在处理包含带LINQ to XML的命名空间的第三方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)返回Nothing。唯一的区别是命名空间(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.如何解决此问题?

1 个答案:

答案 0 :(得分:4)

不能编译为等效的(用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