XElement ничего не возвращает из другого XElement

#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