鉴于XML:
<Foo xmlns="http://www.un.org/sanctions/1.0">
<DateOfIssue>
<Year>2016</Year>
<Month>1</Month>
<Day>16</Day>
</DateOfIssue>
<OtherTag>
...
</OtherTag>
</Foo>
必须有更好的方法来做到这一点。到目前为止,我只能找到这个:
Dim doc As XDocument = XDocument.Load("sample.xml")
Dim xml As XElement = doc.Root
Dim stuff As IEnumerable(Of XElement) = xml.Elements
For Each s In stuff
If s.Name.LocalName = "DateOfIssue" Then
PublishDate = cdate(s.Elements().FirstOrDefault(Function(x) x.Name.LocalName = "Month").Value & "/" & s.Elements().FirstOrDefault(Function(x) x.Name.LocalName = "Day").Value & "/" & s.Elements().FirstOrDefault(Function(x) x.Name.LocalName = "Year").Value)
Exit For
End If
Next
我想阅读元素并构建一个日期。我尝试了Descendants,Elements和这里提到的时髦s...<Year>.Value
https://msdn.microsoft.com/en-us/library/bb384974.aspx?f=255&MSPPError=-2147217396
我尝试过的其他方法都没有。 我必须遗漏一些非常简单的东西,但我找不到它。
提前致谢。
答案 0 :(得分:4)
您的实际XML在根元素级别声明了默认名称空间:
xmlns="http://www.un.org/sanctions/1.0"
请注意,没有前缀的后代元素会隐式继承祖先的默认命名空间。您可以使用Imports
将前缀映射到默认名称空间URI,如下所示:
Imports <xmlns:d = "http://www.un.org/sanctions/1.0">
然后使用前缀和元素的本地名称来引用命名空间中的元素,例如:
Dim xml = <Foo xmlns="http://www.un.org/sanctions/1.0">
<DateOfIssue>
<Year>2016</Year>
<Month>1</Month>
<Day>16</Day>
</DateOfIssue>
<OtherTag>
...
</OtherTag>
</Foo>
Dim dates = xml.<d:DateOfIssue>.Select(Function(x) _
New Date( _
Integer.Parse(x.<d:Year>.Value), _
Integer.Parse(x.<d:Month>.Value), _
Integer.Parse(x.<d:Day>.Value) _
) _
)
答案 1 :(得分:2)
试试这个。请注意,要使用实际文件,您将需要第一个注释文档,并删除我用于测试的XElement。
Dim doc As XElement = XElement.Load("sample.xml") //use this for testing
Dim doc As XElement = <Foo>
<DateOfIssue>
<Year>2016</Year>
<Month>1</Month>
<Day>16</Day>
</DateOfIssue>
<OtherTag>...</OtherTag>
</Foo>
Dim dts As String = doc.<DateOfIssue>.<Month>.Value & "/" & doc.<DateOfIssue>.<Day>.Value & "/" & doc.<DateOfIssue>.<Year>.Value
Dim PublishDate As Date = Date.Parse(dts)
这可能会更短,但这样你就可以看到做了什么。
编辑:我昨晚试图做的是这个 Dim doc As XElement = XElement.Load("https://www.treasury.gov/ofac/downloads/sanctions/1.0/cons_advanced.xml") 'use this
Dim ns As XNamespace = doc.GetDefaultNamespace()
XNamespace会告诉我们要把什么放进这个
Imports <xmlns:s="what goes here">
今天早上看的时候,我看到har07击败了我。
我通过添加此Imports
进行测试Imports <xmlns:s="http://www.un.org/sanctions/1.0">
然后做了这个
Dim doc As XElement = XElement.Load("https://www.treasury.gov/ofac/downloads/sanctions/1.0/cons_advanced.xml") 'use this
' Dim ns As XNamespace = doc.GetDefaultNamespace()
Dim dts As String = doc.<s:DateOfIssue>.<s:Month>.Value & "/" & doc.<s:DateOfIssue>.<s:Day>.Value & "/" & doc.<s:DateOfIssue>.<s:Year>.Value
Dim PublishDate As Date = Date.Parse(dts)
我做的另一件事是将XmlToSchema项添加到我的项目中。当添加它时,有一个从web加载的选项,我使用https://www.treasury.gov/ofac/downloads/sanctions/1.0/cons_advanced.xml通过做我觉得有用的intellisense工作。昨晚不知道我的网络发生了什么事,很糟糕。