我有一个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
之类的东西的替代方法是什么?
答案 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。
类似的答案: