Как я могу получить доступ к свойству XML, которое находится в пространстве имен, используя нотацию «XDocument. <Vehicles>. <Truck>. <Weight>.Value»? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть 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 с пространством имен?

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Мое решение было бы добавить пространство имен 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.

0 голосов
/ 07 июня 2018

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

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

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

Или

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

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

Подобные ответы:

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

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

0 голосов
/ 07 июня 2018

Вы можете использовать схему 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...