提问人:Mark Mullen 提问时间:8/7/2023 更新时间:8/7/2023 访问量:29
如何访问后代节点的值
How to get access to the values of descendent nodes
问:
我有以下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
答:
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
上一个:读取 XML 发票节点的内容
评论