Elfy71 Ответов: 1

Найти узлы XML внутри узлов?


Привет,

Я изо всех сил пытаюсь понять, как извлечь внутренние текстовые значения узлов xml, где родительский узел не всегда содержит один и тот же дочерний узел. Ниже приведен мой xml-файл (урезанная версия). Я пытаюсь извлечь значения атрибутов из каждого узла PointRecord, где они существуют. Атрибут может существовать, а может и не существовать.

Я хочу извлечь значение PointRecord 'Name' и все значения атрибутов только в том случае, если они существуют. :( есть идеи? Прости меня, потому что я немного нуб..

<PointRecord ID="00000059" TimeStamp="2019-03-16T11:53:43">
            <Name>1A</Name>
            <Method>DirectReading</Method>
            <Features>
                <Feature Name="elCABL">
                    <Attribute>
                        <Name>DSS Code</Name>
                        <Value>21</Value>
                    </Attribute>
                    <Attribute>
                        <Name>Depth (m)</Name>
                        <Value>0.8</Value>
                    </Attribute>
                    <Attribute>
                        <Name>Class</Name>
                        <Value>B</Value>
                    </Attribute>
                </Feature>
            </Features>
</PointRecord>

<PointRecord ID="00000060" TimeStamp="2019-03-16T11:54:33">
            <Name>1B</Name>
            <Method>DirectReading</Method>
</PointRecord>

<PointRecord ID="00000061" TimeStamp="2019-03-16T11:55:33">
            <Name>1C</Name>
            <Method>DirectReading</Method>
            <Features>
                <Feature Name="elPole">
                    <Attribute>
                        <Name>DSS Code</Name>
                        <Value>23</Value>
                    </Attribute>
                </Feature>
            </Features>
</PointRecord>


Что я уже пробовал:

Dim aux As New XmlDocument()
Dim PointLst As XmlNodeList        
Dim Name as String = String.Empty
aux.Load("test.xml")

PointLst = aux.GetElementsByTagName("PointRecord")

    For Each Att as XmlElement in PointLst

        If Att.GetElementsByTagName("Feature") IsNot Nothing Then

            Name = Att.FirstCild.InnerText
            //lost here, not sure how to procees??
        End If
    Next

		    
                    

1 Ответов

Рейтинг:
2

Maciej Los

Я предпочитаю использовать Класс XDocument[^].


Dim result = xdoc.Root.Descendants("Feature") _
	.SelectMany(Function(x) x.Descendants("Attribute") _
		.Select(Function(y) New With _
		{ _
			.Future = x.Attribute("Name").Value, _
			.Name = y.Element("Name").Value, _
			.Value = y.Element("Value").Value _
		}) _
	) _
	.ToList()


Результат:
Future Name      Value
elCABL DSS Code  21 
elCABL Depth (m) 0.8 
elCABL Class     B 
elPole DSS Code  23