#xml #vb.net #linq
#xml #vb.net #linq
Вопрос:
Я был абсолютно озадачен этой проблемой в течение нескольких часов. В принципе, мне нужно вернуть XElement из другого XElement. Я точно знаю, что узел, который я ищу, существует и написан правильно. Ниже приведен сокращенный пример исходного XML, с которым я работаю.
<PrintXmlFile xmlns="http://www.samplenamespace.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Image>
<AddedDate>2021-03-01T00:00:00</AddedDate>
<Image>
<Forms>
<AddedDate>2021-03-01T00:00:00</AddedDate>
</Forms>
</PrintXmlFile>
Буквально все, что я хочу сделать, это вернуть элемент Forms и любой дочерний элемент (если таковой имеется). Ниже приведена сокращенная версия моего кода.
Private Sub StartProcessingXML(ByRef sourceXML As XElement)
Dim formsXElement As XElement = sourceXML.Element("Forms")
End Sub
Когда я просматриваю код formsXElement, всегда ничего. Основываясь на том, что я исследовал, это должно быть так просто, но это может быть не так. Может быть, дело в том, что мне нужно включить пространства имен при поиске в исходном xml? Если да, то каков наилучший способ сделать это. Любая помощь будет оценена.
Комментарии:
1. Применимо ли удаление пространства имен?
2. Если вы можете избавиться от пространства имен.
3. Когда вы переходите к коду, вы должны начать с просмотра содержимого
sourceXML
, чтобы убедиться, что они соответствуют вашим ожиданиям. Кроме того,sourceXML
должно бытьByVal
вместоByRef
, потому что вы не переназначаете его в подпрограмме. Ссылочные типы имеют несколько неинтуитивное поведение сByRef
иByVal
в VB; при ссылочном типе (все, кроме встроенных не-String
типов,Enum
s иStructure
s)ByVal
передается ссылка с фиксированной целью, в то времяByRef
как передается ссылка с изменяемой целью.
Ответ №1:
Входной XML имеет пространство имен по умолчанию. Каждый элемент XML привязан к нему.
Вот как обрабатывать пространство имен по умолчанию.
VB.NET
Private Sub Main()
Dim xelem As XElement = XElement.Parse("<PrintXmlFile xmlns='http://www.samplenamespace.com'
xmlns:i='http://www.w3.org/2001/XMLSchema-instance'>
<Image>
<AddedDate>2021-03-01T00:00:00</AddedDate>
</Image>
<Forms>
<AddedDate>2021-03-01T00:00:00</AddedDate>
</Forms>
</PrintXmlFile>")
Dim ns As XNamespace = xelem.GetDefaultNamespace()
Dim formsXElement As XElement = xelem.Descendants(ns "Forms").FirstOrDefault()
Dim AddedDate As String = formsXElement.Element(ns "AddedDate")?.Value
Console.WriteLine(formsXElement)
Console.WriteLine(AddedDate)
End Sub
Вывод
<Forms xmlns="http://www.samplenamespace.com">
<AddedDate>2021-03-01T00:00:00</AddedDate>
</Forms>
2021-03-01T00:00:00