2010-03-12 110 views
2

我在使用包含LINQ to XML命名空间的第三方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)返回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.如何解决这个问题? ?问题

回答

4

不编译成等效(在C#中的术语):

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

哪里,才能得到“DATABASEPW” 在正确的命名空间就需要相当于:

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

转换为VB,你应该设置?

反射向我保证,(但不要引用我!),这是一样的东西:

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

THX马克,工作就像一个魅力。 – Richard 2010-03-12 20:54:49

+0

这里是VB代码,如果你不在意: 昏暗的NS作为的XNamespace = “http://www.cgi.com/Ratabase” 昏暗xEl2 = XmlWithNs.Descendants(NS + “DATABASEPW”)FirstOrDefault – Richard 2010-03-12 21:02:16

+0

啊。 ,这是更漂亮。我的最后一个VB回到VB6时代,而且我已经生锈了; -p – 2010-03-12 21:07:23