使用XElement访问XML元素

时间:2016-03-22 23:31:36

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

鉴于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

我尝试过的其他方法都没有。 我必须遗漏一些非常简单的东西,但我找不到它。

提前致谢。

2 个答案:

答案 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工作。昨晚不知道我的网络发生了什么事,很糟糕。