如何使用&#34; XDocument。<vehicles>。<truck>。<weight> .Value&#34;来访问名称空间中的XML属性。符号?

时间:2018-06-07 14:10:12

标签: xml vb.net linq linq-to-xml

我有一个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>的{​​{1}},我可以通过:

<Truck>

......我会以快乐的方式。但是,在这种情况下,我的XML文档在开头就有一个命名空间,如下所示:

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

如果我尝试使用上面的行来获取<?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似乎是使用Visual Studio的文本填充的阅读器。

如果能够使用我之前使用的上述XDocument表示法,同时保持XML文件不变,我该怎么办?如果这是不可能的,那么在带有命名空间的XML文件中访问xdoc之类的东西的替代方法是什么?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用xml架构读取XML中的所有值。

要执行此操作,请使用开发人员命令提示符(位于开始菜单中)并键入:xsd /?

这将提供有关如何使用xml文件创建架构的更多信息。

例如,使用名为myTest.xml的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。

答案 2 :(得分:0)

我不熟悉这种符号,所以我不知道是否可以将它用于命名空间。

如果你找不到方法,可以选择以下方法:

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 +“Name”,因为文档中有默认命名空间。 xNS +“Name”将为您隐式转换为XName。

类似的答案:

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

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