我在处理包含带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.如何解决此问题?
答案 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