Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何从它指定的元素';s属性?_Xml_Vbscript_Xmldom - Fatal编程技术网

Xml 如何从它指定的元素';s属性?

Xml 如何从它指定的元素';s属性?,xml,vbscript,xmldom,Xml,Vbscript,Xmldom,我有一个xml文件,看起来像这样 [data.xml] 像这样调用函数 将返回 “Text1” “Text2” “Text3” “文本4” 我希望能够通过指定其父节点的属性来返回childnode元素.text。像这样的东西 [psuedo代码-如果我离开这里请原谅] 会返回这样的东西 “Text1” 我之所以问这个问题,是因为我希望删除特定的元素名称,而代之以通用的名称,然后能够通过指定属性来调用特定的element.text信息。我不喜欢为xml文档中的每个新条目创建和维护唯一的元素标记 我

我有一个xml文件,看起来像这样

[data.xml]

像这样调用函数

将返回

“Text1”
“Text2”
“Text3”
“文本4”

我希望能够通过指定其父节点的属性来返回childnode元素.text。像这样的东西

[psuedo代码-如果我离开这里请原谅]

会返回这样的东西

“Text1”

我之所以问这个问题,是因为我希望删除特定的元素名称,而代之以通用的名称,然后能够通过指定属性来调用特定的element.text信息。我不喜欢为xml文档中的每个新条目创建和维护唯一的元素标记

我目前正在使用VBscript,但我可以改成其他可以工作的东西(windows环境)

[---编辑---]

使用Ansgar Wiechers的例子,我创建了以下内容:

[data.xml]


第一个MsgBox将返回“Text1”
第二个MsgBox将返回“Text4”

这正是我想要的

使用来选择节点:

函数GetVar(parentId,childNode) GetVar=Null'设置安全的默认返回值 设置oXMLFile=CreateObject(“Msxml2.DOMDocument.6.0”) oXMLFile.async=False 加载“data.xml” '如果没有将async设置为False,上述指令将加载 '文件,因此您的代码将尝试处理 '尚未完全加载。 如果oXMLFile.parseError=0,则 xpath=“//*[@id=”&parentId&“]/”&childNode Set node=oXMLFile.selectSingleNode(xpath) 如果Not node为Nothing,则GetVar=node.text 其他的 “报告错误 WScript.Echo oXMLFile.parseError.reason 如果结束 端函数 XPath表达式
/*[@id='obj1']/celem1
的意思是:选择任何节点
,该节点的父节点具有属性
id
和值
obj1
。通过使用
selectSingleNode
方法,您可以仅选择此类节点的第一个匹配项(如果有)


如果可以有多个匹配节点,并且您不希望只返回第一个节点的值,那么您需要定义如何处理其他节点的值。

进行一些读取,这似乎可行;oXMLFile.getElementsByTagName(“elem1”)[0].childNodes(“celem1”)[0]我必须试一试。谢谢。这很有效。不过,我有两个后续问题;例1:在我上面的例子中;我有两个子节点“celem1”和“celem2”。现在,让我们将这两个子节点重命名为“celem”。我怎样才能在第二个“名人”上得到回报。例2:在我上面的例子中;我有两个子节点“celem1”和“celem2”。现在,让我们将这两个子节点重命名为“celem”。第一个“celem”将具有属性id=“item1”,第二个“celem”将具有属性id=“item2”。我将如何更改您的示例以适合对parentnode.attribute/childnode.attribute的调用?对于第一个示例,您将使用
selectNodes
而不是
selectSingleNode
,并通过
.item(1)
访问结果集合的第二个元素。对于第二个示例,只需向子节点(
../celem[@id='item2']
)添加一个属性选择器即可。很好!例二效果很好。我将发布另一个答案,上面有你的建议。非常感谢你!!我想投你一票,但我还没有足够的代表权。当我有足够的钱时,我会回来的!
<?xml version="1.0"?>
    <elem1 id="obj1">
        <celem1>Text1</celem1><celem2>Text2</celem2>
    </elem1>
    <elem2 id="obj2">
        <celem1>Text3</celem1><celem2>Text4</celem2>
    </elem2>
Function GetVar(XMLTag, strNum)
   Set oXMLFile = CreateObject("Msxml2.DOMDocument")
       oXMLFile.Load("data.xml")
   Set oXMLFileVariable = oXMLFile.getElementsByTagName(XMLTag)
       GetVar = oXMLFileVariable.Item(strNum).Text
End Function
    Call GetVar("celem1", 0)
    Call GetVar("celem2", 0)
    Call GetVar("celem1", 1)
    Call GetVar("celem2", 1)
    GetChildNode.Text(elem1(GetAttribute="obj1").celem1())
<?xml version="1.0"?>
  <elem id="obj1">
      <celem id="item1">Text1</celem><celem id="item2">Text2</celem>
  </elem>
  <elem id="obj2">
      <celem id="item1">Text3</celem><celem id="item2">Text4</celem>
  </elem>
str1 = GetVar("obj1", "celem", "item1")
str2 = GetVar("obj2", "celem", "item2")
MsgBox str1
MsgBox str2

Function GetVar(parentID, childNode, childAtt)
    GetVar = Null 'set a safe default return value

    Set oXMLFile = CreateObject("Msxml2.DOMDocument.6.0")
    oXMLFile.async = False
    oXMLFile.Load "xpath.xml"

    If oXMLFile.parseError = 0 Then
            xpath = "//*[@id='" & parentID & "']/" & childNode _
               & "[@id='" & childAtt & "']"
            Set node = oXMLFile.selectSingleNode(xpath)
            If Not node Is Nothing Then GetVar = node.text
    Else
            'report errors
            WScript.Echo oXMLFile.parseError.reason
    End If
End Function