使用 XElement 访问 XML 个元素
Access XML Elements using XElement
鉴于 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 和这里提到的 funky s...<Year>.Value
https://msdn.microsoft.com/en-us/library/bb384974.aspx?f=255&MSPPError=-2147217396
我尝试过的所有其他方法returns 没有。
我一定是遗漏了一些非常简单的东西,但我找不到它。
提前致谢。
试试这个。请注意,要使用实际文件,您需要第一个注释文档,并去掉我用来测试的 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 <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 通过执行我认为有用的智能感知工作。不知道昨晚我的网络发生了什么,太糟糕了。
您的实际 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) _
) _
)
鉴于 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 和这里提到的 funky s...<Year>.Value
https://msdn.microsoft.com/en-us/library/bb384974.aspx?f=255&MSPPError=-2147217396
我尝试过的所有其他方法returns 没有。 我一定是遗漏了一些非常简单的东西,但我找不到它。
提前致谢。
试试这个。请注意,要使用实际文件,您需要第一个注释文档,并去掉我用来测试的 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 <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 通过执行我认为有用的智能感知工作。不知道昨晚我的网络发生了什么,太糟糕了。
您的实际 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) _
) _
)