更新xml属性

时间:2013-12-06 13:11:18

标签: xml vb.net xpath

我有一个与此类似的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中失败了,但我不知道为什么。

问候

2 个答案:

答案 0 :(得分:1)

您发布的代码不会在不抛出异常的情况下运行。我怀疑你没有看到异常的原因是因为你在Try / Catch块中有这个代码,它正在吃掉异常而没有通知你它发生了。

错误的原因是您选择了item元素,但是您尝试将其转换为XmlAttribute变量。从XmlElementXmlAttribute的强制转换失败并抛出异常。要解决此问题,您需要选择name属性而不是item元素,如下所示:

Dim attr As XmlAttribute = DirectCast(xmlData.SelectSingleNode("//sublist[@id='a']/item[@name='name1']/@name"), XmlAttribute)

关键区别在于XPath末尾的/@name。请注意,我还添加了DirectCast。当DirectCastOption 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>           
            <%}
        }
    }
}