【问题标题】:Get an XML Element value from a DTSX File Using an XML Parser使用 XML 解析器从 DTSX 文件中获取 XML 元素值
【发布时间】:2017-04-27 21:00:27
【问题描述】:

dtsx(SSIS 包文件)是一个 Xml 文件。它包含一个名为PackageFormatVersion的元素(SSDT的哪个版本与这个包相关)

 <DTS:Property
DTS:Name="PackageFormatVersion">8</DTS:Property>

我已经编写了一个 Vb.net 脚本来使用 RegEx 使用以下表达式检索此元素值(它工作正常)

  Dim strA As String = Regex.Match(strContent, "(?<=""PackageFormatVersion"">)(.*)(?=</DTS:Property>)", RegexOptions.Singleline).Value

但我认为推荐的实现方式是使用XML Parser,我不知道如何实现它。有什么帮助吗?

我接受 C# 中的答案

包 Xml 看起来像:

<?xml version="1.0"?>
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts"
 DTS:refId="Package"
 DTS:CreationDate="3/26/2017 11:44:38 PM"
 DTS:CreationName="Microsoft.Package"
 DTS:CreatorComputerName="MyComputer"
 DTS:CreatorName="MyComputer\Admin"
 DTS:DTSID="{384605BC-FC77-4506-B409-C1EE9B21BAE2}"
 DTS:ExecutableType="Microsoft.Package"
 DTS:LastModifiedProductVersion="13.0.4001.0"
 DTS:LocaleID="1033"
 DTS:ObjectName="Package"
 DTS:PackageType="5"
 DTS:VersionBuild="2"
 DTS:VersionGUID="{66D08BFA-6426-4123-99F7-6E655B79AF6D}">
 <DTS:Property
 DTS:Name="PackageFormatVersion">8</DTS:Property>
 <DTS:ConnectionManagers>
 <DTS:ConnectionManager ...

【问题讨论】:

  • 为什么使用 XML 解析器是“推荐的方式”?我喜欢你所做的。正则表达式快速、直接,并且不需要对完整 XML 文档的嵌套结构进行详细解析。如果您采用 XML Parser 方式,您会将自己绑定到 DTS 包的近乎精确的模式(可以从一个版本更改为另一个版本)。虽然您所追求的属性当前确实存在于顶级节点中,但正则表达式仍然可能是一种更精简、更快的方法。牢记您的实际需求,让这些需求的最佳解决方案胜出。 我的意见>
  • @ryancdotnet 正则表达式将失败,如果一个新的属性被添加到元素,或者如果一个空格,换行被添加。虽然 xml 解析器可以通过名称搜索特定标签。然后得到它的价值。此外,正则表达式可能会失败,ssis 包含一个名为 PackageFormatVersion 的变量(用户可能不知道此属性并将此名称用作变量)。另外我认为,当它完全是关于结构良好的数据时,正则表达式不是推荐的方式。

标签: c# vb.net ssis xml-parsing etl


【解决方案1】:

我终于找到了解决办法

Dim strA As String = ""

Dim xml = XDocument.Load(strFile)

Dim ns As XNamespace = "www.microsoft.com/SqlServer/Dts"
Dim man As XmlNamespaceManager = New XmlNamespaceManager(New NameTable())
man.AddNamespace("DTS", "www.microsoft.com/SqlServer/Dts")

If Not xml.Root Is Nothing AndAlso
   Not xml.Root.Descendants(ns + "Property").Attributes(ns + "Name") Is Nothing AndAlso
   xml.Root.Descendants(ns + "Property").Attributes(ns + "Name").Where(Function(x) x.Value = "PackageFormatVersion").Count > 0 Then

   strA = xml.Root.Descendants(ns + "Property").Attributes(ns + "Name").Where(Function(x) x.Value = "PackageFormatVersion").FirstOrDefault.Parent.Value


End If

Msgbox(strA)

我从这个问题开始Parse SSIS .xml source to retrieve table mappings

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多