1

下面是我的 XML 文件和使用值获取父节点的函数。但我很惊讶地得到了父节点。

当值 133 传递给函数时,它应该返回“firstnode”,当 124 传递给函数时,它应该返回“secondnode”

我怎样才能做到这一点?我正在使用 vb.net,但我也可以使用 C#。

我的 XML 文件:

<sample>
    <firstnode>
        <id>133</id>
    </firstnode>
    <secondnode>
        <id>124</id>
    </secondnode>
</sample>

我在 vb.net 中的功能:

Public Shared Function Get_NodeName_by_ID(ByVal ID As String) As String
    Dim value As String = "" 
    Dim strPath = HttpContext.Current.Server.MapPath("~/" + ConfigurationManager.AppSettings("app_settings").ToString())
    Dim doc As New XmlDocument()
    doc.Load(strPath) 

    Return value
End Function
4

3 回答 3

3

XPath 为您提供了根据您的要求操作 XML 文档的工具。使用下面的 XPath 表达式来执行此操作,抱歉我的代码是 C#,所以您需要将其转换为 vb。

XPath 表达式:sample/*[id=133]

C#代码:

//Load FileXML
XmlDocument objFileXML = new XmlDocument();

objFileXML .Load(sFilePath);

//For selecting nodes having given value
XmlNodeList lstNodes = objFileXML .SelectNodes("sample/*[id=133]");

注意:如果要动态放置值,可以放置任何变量。它只会在您的 vb 代码中。我希望这对你有用。

于 2012-12-19T04:30:14.910 回答
1

我的这个解决方案工作者。

 Dim strPath = HttpContext.Current.Server.MapPath("~/" + ConfigurationManager.AppSettings("settings").ToString())
            Dim doc As New XmlDocument()
            doc.Load(strPath)

        Dim ParentNode As XmlNodeList = doc.GetElementsByTagName("id")
        For Each node As XmlNode In ParentNode 
            If (ID.Equals(node.ChildNodes(0).Value)) Then
                value = node.ParentNode.Name.ToString()
            End If 
        Next
于 2012-12-19T08:33:51.693 回答
0

虽然确实可能存在相对晦涩的方法来通过无数 XML 处理技术获得所需的答案/结果,但永远不要忽视低级方法的简单性和速度。

提交的 foreach 迭代的逻辑对我来说看起来很棒,但我没有时间测试它。尽管如此,作者声称他们已经这样做了;粗略一看,发现它的逻辑似乎是合理的;我相信任何选择部署它的人都会很快发现它的价值。它可能是一颗宝石。

但我认为应该提供替代解决方案的原因是,虽然我们必须尊重可以提供此类答案的私密资金,但我们的立场是,每当我们遇到此类表面上的困难时,缺乏如此私密的知识(否则我们不会没有问题)。找到一种高级方法来解决我们的问题通常需要大量的研究和思考,然后才能有机会获得这样的前瞻性解决方案。并且,在他们的设计中有特定的意图,他们通常可能不会产生我们所追求的结果。我经常看到寻找和掌握这些方法的努力远远超过了我们自己设计一个合适的方法的工作。

为了避免这些更高的成本,我们应该首先想出如何自己完成所引用的复杂性的目标。在过去对平面文件数据库进行了大量工作,我觉得简单的文本文件处理方法很容易解决您的问题。但是,以下建议方法的潜在成功取决于对随问题提供的 XML 数据格式的不可侵犯的遵守。

因为您的问题对象需要识别 XML标记的内容,您可以通过搜索 XML 文件非常简单地解决您的问题,而不是搜索“ 133 ”,而是搜索“ >133< ”。例如,如果可能无意中将空格包含在标签中(例如在 "> 133 <" 中),您可以使用正则表达式搜索来解决这种潜在的差异。但是,正确生成的文件不应具有此类预期偏差。尽管如此,您有责任预见这些可能性,并在可能的情况下对其进行解释存在。由于正则表达式会减慢您的搜索速度(因为并行功能会减慢 XML 工具的搜索速度),如果不需要正则表达式,请避免正则表达式的额外开销和单调乏味。

在任何情况下,如果文件是按照您仔细问题的标准写入的(正确显示没有空格的值),您可以简单地在文件中搜索“>133<”(消除错误处理“123133”的可能性, “13345”等)。

在文件中获取您成功查找的位置,然后解析以下字符,直到您发现“</”的第一个实例 - 此后仅收集以下字符,直到但不包括下一个“>”。

这种简单而常规的做法将分别产生您所要求的答案,“firstnode”和“secondnode”。

很可能,任何更高级别的方法甚至可能会慢一点,或者需要更多开销(尽管两者的结果在中小型文件上应该几乎是即时的),因为例如,XML 工具通常会查找和处理开始和结束标签 - 如果它识别出该字段表示整数,则检测并删除潜在的空白。我们通常并不真正知道这些内部功能是如何工作的,而是从观察到的行为中知道的。然而,必要时,高级设施经常执行对我们应用程序的显式对象来说可有可无的操作。

因此,考虑到处理文本文件的二进制方法早已被优化,您精心编写的低级方法应该提供最大的速度......即使这实际上只是在超大文件中的考虑因素。速度总是代表效率和理想的编码实践。需要了解的重要一点是,您的低级流程可能至少与使用您自己可能永远找不到的高级 XML 工具一样快——并且可能无法在您可以编写一个简单的低级程序。

于 2021-08-26T17:10:38.103 回答