Поиск XDocument с использованием LINQ без знания пространства имен

Есть ли способ поиска XDocument без знания пространства имен? У меня есть процесс, который регистрирует все запросы SOAP и шифрует конфиденциальные данные. Я хочу найти любые элементы, основанные на имени. Что-то вроде, дайте мне все элементы, где имя – CreditCard. Меня не волнует, что такое пространство имен.

Моя проблема связана с LINQ и требует пространства имен xml.

У меня есть другие процессы, которые извлекают значения из XML, но я знаю пространство имен для этого другого процесса.

XDocument xDocument = XDocument.Load(@"C:\temp\Packet.xml"); XNamespace xNamespace = "http://CompanyName.AppName.Service.Contracts"; var elements = xDocument.Root .DescendantsAndSelf() .Elements() .Where(d => d.Name == xNamespace + "CreditCardNumber"); 

Я действительно хочу иметь возможность искать xml, не зная об пространствах имен, что-то вроде этого:

 XDocument xDocument = XDocument.Load(@"C:\temp\Packet.xml"); var elements = xDocument.Root .DescendantsAndSelf() .Elements() .Where(d => d.Name == "CreditCardNumber") 

Это не сработает, потому что я не знаю пространство имен заранее во время компиляции.

Как это может быть сделано?

     83838 Tom Jackson   789875 Chris Smith  ...     83838 64588  ... 

Как указывает Адам в комментарии, XName конвертируются в строку, но для этой строки требуется пространство имен, если оно есть. Вот почему сравнение .Name с строкой терпит неудачу или почему вы не можете передать «Person» в качестве параметра XLinq Method для фильтрации по их имени.
XName состоит из префикса (пространство имен) и LocalName. Локальное имя – это то, что вы хотите запросить, если вы игнорируете пространства имен.
Спасибо, Адам 🙂

Вы не можете поместить имя узла в качестве параметра метода .Descendants (), но вы можете запросить его так:

 var doc= XElement.Parse( @"    83838 Tom Jackson   789875 Chris Smith    "); 

EDIT: плохая копия / прошлое из моего теста 🙂

 var persons = from p in doc.Descendants() where p.Name.LocalName == "Person" select p; foreach (var p in persons) { Console.WriteLine(p); } 

Это подходит для меня…

Вы можете взять пространство имен из корневого элемента:

 XDocument xDocument = XDocument.Load(@"C:\temp\Packet.xml"); var ns = xDocument.Root.Name.Namespace; 

Теперь вы можете легко получить все нужные элементы с помощью оператора plus:

 root.Elements(ns + "CreditCardNumber") 

Кажется, я нашел то, что искал. Вы можете видеть в следующем коде, я делаю оценку Element.Name.LocalName == "CreditCardNumber" . Это, казалось, работало в моих тестах. Я не уверен, что это лучшая практика, но я буду использовать ее.

 XDocument xDocument = XDocument.Load(@"C:\temp\Packet.xml"); var elements = xDocument.Root.DescendantsAndSelf().Elements().Where(d => d.Name.LocalName == "CreditCardNumber"); 

Теперь у меня есть элементы, где я могу шифровать значения.

Если у кого-то есть лучшее решение, предоставьте его. Благодарю.

Если ваши XML-документы всегда определяют пространство имен в одном узле (узел Request в двух приведенных примерах), вы можете определить его, сделав запрос и видя, какое пространство имен имеет результат:

 XDocument xDoc = XDocument.Load("filename.xml"); //Initial query to get namespace: var reqNodes = from el in xDoc.Root.Descendants() where el.Name.LocalName == "Request" select el; foreach(var reqNode in reqNodes) { XNamespace xns = reqNode.Name.Namespace; //Queries making use of namespace: var person = from el in reqNode.Elements(xns + "Person") select el; } 

Просто используйте метод Descendents:

 XDocument doc = XDocument.Load(filename); String[] creditCards = (from creditCardNode in doc.Root.Descendents("CreditCardNumber") select creditCardNode.Value).ToArray(); 
  • XDocument.Validate всегда успешно
  • LINQ для чтения XML
  • Создание XML-файла с использованием XDocument в C #
  • XDocument, содержащий пространства имен
  • Как предотвратить System.Xml.XmlException: недопустимый символ в данной кодировке
  • XmlTextReader против XDocument
  • Как получить строку json из url?
  • как использовать XPath с XDocument?
  • Символ ':', шестнадцатеричное значение 0x3A, не может быть включен в имя
  • Как использовать XPath с XElement или LINQ?
  • Давайте будем гением компьютера.