如何访问后代节点的值

How to get access to the values of descendent nodes

提问人:Mark Mullen 提问时间:8/7/2023 更新时间:8/7/2023 访问量:29

问:

我有以下xml文件,尝试修改每个节点中的值,例如属性“client”。

<?xml version="1.0"?>
<report>
  <feature tag="Config"/>
  <feature tag="Runtime">
    <feature tag="Metadata">
      <property name="date" type="date" editable="false" visible="true" required="false" value="01.01.1970"/>
      <property name="time" type="time" editable="false" visible="true" required="false" value="00:00:00"/>
      <property name="client" editable="false" visible="true" required="false" value="IBM Engineering Lifecycle Optimization - Publishing"/>
     </feature>
  <feature tag="Output">
 <feature tag="Log"/>
<feature tag="Templates">

我尝试了以下代码来访问节点。问题是,此代码仅检测“报告”节点,而不检测具有“feature tag=”name“的节点。

在我看来,这不是标准的 XML,这就是为什么命名标签没有用它们的名称检测到的原因。

是否有可能通过名称访问“功能标签”?

Dim doc As XDocument = XDocument.Load(filename)

        For Each xName As XElement In doc.Descendants("report")
            
        'From here I tried in the debugger to get access to one of the named tags, but without success

        Next xName
XML vb.net

评论

1赞 Siebe Jongebloed 8/7/2023
请将您的 xml 更正为有效的 xml。

答:

0赞 Almo 8/7/2023 #1

问题很可能是引用的XML无效,它缺少多个结束标记。下面是 XML 可能需要的外观示例:-

<?xml version="1.0"?>
<report>
    <feature tag="Config"/>
    <feature tag="Runtime"/>
    <feature tag="Metadata">
        <property name="date" type="date" editable="false" visible="true" required="false" value="01.01.1970"/>
        <property name="time" type="time" editable="false" visible="true" required="false" value="00:00:00"/>
        <property name="client" editable="false" visible="true" required="false" value="IBM Engineering Lifecycle Optimization - Publishing"/>
    </feature>
    <feature tag="Output"/>
    <feature tag="Log"/>
    <feature tag="Templates"/>
</report>

也许使用在线验证工具(例如 https://freeonlineformatter.com/xml-validator 的验证工具)来检查您的代码。

评论

0赞 Mark Mullen 8/7/2023
onlinevalidator 说“有效的 xml”,所以原因一定是不同的。
0赞 Siebe Jongebloed 8/7/2023
此答案中的 xml 是有效的,但问题中的 xml 不是
1赞 dbasnett 8/7/2023 #2

问题不清楚,XML无效... 所以这只是一个 WAG,

    Dim doc As XElement
    ' doc = XElement.Load(filename)
    'FOR TEST - use literal
    doc = <report>
              <feature tag="Config"/>
              <feature tag="Runtime"/>
              <feature tag="Metadata">
                  <property name="date" type="date" editable="false" visible="true" required="false" value="01.01.1970"/>
                  <property name="time" type="time" editable="false" visible="true" required="false" value="00:00:00"/>
                  <property name="client" editable="false" visible="true" required="false" value="IBM Engineering Lifecycle Optimization - Publishing"/>
              </feature>
              <feature tag="Output"/>
              <feature tag="Log"/>
              <feature tag="Templates"/>
          </report>

    Dim ie As IEnumerable(Of XElement)
    ie = doc.Descendants 'all elements

    ie = doc.Elements 'top level elements

    ' <property> element with an attribute name = client
    ie = From el In doc...<property>
            Where el.@name = "client"
            Select el

    ' <feature> element with an attribute tag = Metadata
    ie = From el In doc...<feature>
            Where el.@tag = "Metadata"
            Select el