Nano Hash - криптовалюты, майнинг, программирование

Как получить доступ к свойству XML, находящемуся в пространстве имен, с помощью нотации XDocument.‹Транспортные средства›.‹Грузовик›.‹Вес›.Value?

У меня есть XML-документ, из которого мне нужно получить только 2 значения. В прошлом я мог сделать это очень легко, используя XDocument:

Пример XML:

<?xml version="1.0" standalone="yes"?>
<Vehicles>
   <Truck>
     <Color>Blue</Color>
     <Make>General Motors</Make>
     <Weight>3000</Weight>
   </Truck>
</Vehicles>

Если бы я хотел получить доступ только к <Weight> из <Truck>, я мог бы сделать это:

Dim xdoc as XDocument = XDocument.Load("c:/example.xml")
Dim truckWeight as Integer = Integer.Parse(xdoc.<Vehicles>.<Truck>.<Weight>.Value)

... и я был бы на моем веселом пути. Однако в этом случае мой XML-документ имеет пространство имен в начале, например:

<?xml version="1.0" standalone="yes"?>
<Vehicles xmlns="http://interweb.com/Vehicles.xsd">
   <Truck>
      <Color>Blue</Color>
      <Make>General Motors</Make>
      <Weight>3000</Weight>
   </Truck>
</Vehicles>

Если я попытаюсь использовать приведенные выше строки для получения truckWeight, .Value вернет Nothing, даже если xdoc окажется заполненным с помощью средства чтения текста Visual Studio.

Что я могу сделать, чтобы иметь возможность использовать упомянутую нотацию XDocument, которую я использовал ранее, оставив файл XML без изменений? Если это невозможно, каков альтернативный способ доступа к чему-то вроде <Weight> в файле XML с пространством имен?

07.06.2018

Ответы:


1

Моим решением было бы добавить пространство имен xmlns к каждому элементу. В вашем примере это будет выглядеть так:

Dim ns As XNamespace = "http://interweb.com/Vehicles.xsd"
Dim truckWeight As Integer = Integer.Parse(xdoc.Element(ns + "Vehicles").Element(ns + "Truck").Element(ns + "Weight").Value)

Когда этот код выполняется, truckWeight будет содержать значение 3000.

07.06.2018
  • Фантастический! Это отлично сработало, тем более что я могу просто получить пространство имен любого документа xml, с которым я работаю, используя xdoc.Root.Name.Namespace. Спасибо! 07.06.2018

  • 2

    Я не знаком с обозначениями, поэтому не могу сказать, можно или нет использовать это с пространствами имен.

    Вот альтернатива, если вы не найдете способ:

    Dim xNS As XNamespace = "http://interweb.com/Vehicles.xsd"
    Weight = xDoc.Root.Element(xNS + "Truck").Element(xNS + "Weight").Value
    

    Or

    Weight = xDoc.Element(xNS + "Vehicles").Element(xNS + "Truck").Element(xNS + "Weight").Value
    

    Вам нужно xNS + «Имя» для каждого элемента, так как у вас есть пространство имен по умолчанию в документе. xNS+"Name" сделает за вас неявное преобразование в XName.

    Похожие ответы:

    https://stackoverflow.com/a/2998837/1486185

    https://stackoverflow.com/a/16018466/1486185

    07.06.2018
  • Спасибо за ответ, но этот метод кажется дубликатом ответа Себастьяна, который я уже отметил как правильный. 07.06.2018

  • 3

    Вы можете использовать схему xml для чтения всех значений из XML.

    Для этого используйте командную строку разработчика (находится в меню «Пуск») и введите: xsd /?

    это даст больше информации о том, как создать схему с помощью вашего XML-файла.

    например, с файлом xml с именем myTest.xml:

    xsd myTest.xml
    xsd myTest.xsd /c /l:vb
    

    Затем добавьте созданные файлы (myTest.xsd и myTest.vb) в свой проект.

    я не совсем уверен, как вы будете использовать это в Visual Basic, но в C# вы сделаете что-то вроде этого:

        public myTest getMyTest(XDocument doc)
        {
            StringReader sr = new StringReader(doc.ToString());
            XmlReaderSettings settings = new XmlReaderSettings();
            XmlReader reader = XmlReader.Create(sr, settings);
            XmlSerializer xmlSerialize = new XmlSerializer(typeof(myTest));
            return (myTest)xmlSerialize.Deserialize(reader);
        }
    

    Значения из XML будут свойствами в объекте, который возвращается вышеуказанным методом. Вам просто нужно перевести вышеперечисленное на Visual Basic.

    07.06.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..