我有一个与此类似的XML
<list>
<sublist id="a">
<item name="name1">
<property1>a</property1>
<property2>b</property2>
</item>
<item name="name2">
<property1>c</property1>
<property2>d</property2>
</item>
</sublist>
<sublist id="b">
[...more XML here...]
</sublist>
</list>
我想修改特定项的name属性。子列表id,项目名称和新项目名称将作为参数传递给函数。所以它看起来像这样:
<list>
<sublist id="a">
<item name="****NEW NAME****">
<property1>a</property1>
<property2>b</property2>
</item>
<item name="name2">
<property1>c</property1>
<property2>d</property2>
</item>
</sublist>
<sublist id="b">
[...more XML here...]
</sublist>
</list>
这是我用来替换它的代码(我没有添加用于加载和保存XML的代码,传递参数......我实现了它们)
[...Load XML...]
Dim attr as XmlAttribute
attr = xmlData.SelectSingleNode.("//sublist[@id='" & sublistID & "']/item[@name='" & itemName & "'")
attr.Value = newName
[...Save XML...]
sublistID,itemName和newName作为参数传递给函数(如前所述)。我认为我在SelectSingleNode中失败了,但我不知道为什么。
问候
答案 0 :(得分:1)
您发布的代码不会在不抛出异常的情况下运行。我怀疑你没有看到异常的原因是因为你在Try / Catch块中有这个代码,它正在吃掉异常而没有通知你它发生了。
错误的原因是您选择了item
元素,但是您尝试将其转换为XmlAttribute
变量。从XmlElement
到XmlAttribute
的强制转换失败并抛出异常。要解决此问题,您需要选择name
属性而不是item
元素,如下所示:
Dim attr As XmlAttribute = DirectCast(xmlData.SelectSingleNode("//sublist[@id='a']/item[@name='name1']/@name"), XmlAttribute)
关键区别在于XPath末尾的/@name
。请注意,我还添加了DirectCast
。当DirectCast
有Option Strict On
时,有{{1}}这是必要的,因为你几乎肯定应该这样做。
答案 1 :(得分:1)
这会对你有所帮助。我的目的是为了我的目的......你可以根据你的要求改变这个......
if (System.IO.File.Exists(ConfigurationManager.AppSettings["DBCache"].ToString() + "Frame.xml"))
{
System.Xml.XmlDocument doc1f = new System.Xml.XmlDocument();
doc1f.Load(ConfigurationManager.AppSettings["DBCache"].ToString() + "Frame.xml");
System.Xml.XmlNode rootcomment1f = doc1f.SelectSingleNode("/FrameDetail");
System.Xml.XmlNodeList nodes1f = rootcomment1f.SelectNodes("Frame");
if (nodes1f.Count != 0)
{
System.Xml.XmlDocument docff = new System.Xml.XmlDocument();
docff.Load(ConfigurationManager.AppSettings["DBCache"].ToString() + "Frame.xml");
System.Xml.XmlNode rootcommentff = docff.SelectSingleNode("/FrameDetail");
System.Xml.XmlNodeList nodesff = rootcommentff.SelectNodes("Frame");
for (int i = 0; i < nodesff.Count; i++)
{
if (nodesff[i].SelectSingleNode("REFERENCEID").InnerText.Trim() == "2")
{%>
<center><div style="padding:1px;width:100%;height:100%;"><iframe src="<%=nodesff[i].SelectSingleNode("URL").InnerText%>" frameborder="0" allowtransparency="true" style="background:transparent;" scrolling="auto"></iframe></div></center>
<%}
}
}
}