Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 国王\\目录“) 当然,您还可以使用通用语言将XML内容转换为表格格式,以便数据库导入或分隔文件导出_Sql_Sql Server_Xml_Tsql_Sql Server 2012 - Fatal编程技术网

Sql 国王\\目录“) 当然,您还可以使用通用语言将XML内容转换为表格格式,以便数据库导入或分隔文件导出

Sql 国王\\目录“) 当然,您还可以使用通用语言将XML内容转换为表格格式,以便数据库导入或分隔文件导出,sql,sql-server,xml,tsql,sql-server-2012,Sql,Sql Server,Xml,Tsql,Sql Server 2012,尽管SQL很好,但它是一种特殊用途的语言,不像Java、C#、Python、PHP、Perl、VB和其他一些语言那样流动或动态,这些语言还带有运行XPath、XSLT和其他XML特定任务的库。此外,这些语言可以连接到任何数据库以检索BLOB数据 对于未来的读者,以下是使用OP数据需求的开源示例。您会注意到在XPath中使用了带[]的位置括号,允许使用更多DTS:ConnectionManager元素: Python(使用lxml库) PHP(使用简单的xml对象) R(使用xml库) 库(XML

尽管SQL很好,但它是一种特殊用途的语言,不像Java、C#、Python、PHP、Perl、VB和其他一些语言那样流动或动态,这些语言还带有运行XPath、XSLT和其他XML特定任务的库。此外,这些语言可以连接到任何数据库以检索BLOB数据

对于未来的读者,以下是使用OP数据需求的开源示例。您会注意到在XPath中使用了带
[]
的位置括号,允许使用更多
DTS:ConnectionManager
元素:

Python(使用lxml库)

PHP(使用简单的xml对象)

R(使用xml库)

库(XML)
setwd(“C:\\Path\\To\\Working\\Directory”)


docthanks buddy。此sln适用于原始帖子中的字符串。但是,当我添加另一个“节点”(我想根级别的节点是正确的术语?!)时,它不会给我任何输出。请尝试在分号后的最后一行
交叉应用…
中设置根元素的名称。节点沿路径读取(称为“XPATH”)这个路径从根开始…如果我将最后一行更改为“CROSS-APPLY@XML.nodes('declare namespace DTS=“”;/DTS:Executable/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager')为y(vals)”,它仍然不会给出任何输出(我还将其添加到了上一行,也没有输出):(有两个分号吗?应该是
“declare namespace DTS=”http://DTS“;/DTS:Executable/…
@007,您可以使用带方括号的XPath筛选器:使用“/root[1]/row[3]/item[@attr='test']”将查找属性为“attr”且值为“test”的项“在第三行。你可以做更多的事情:某些函数、逻辑表达式、外部变量的使用[查找sql:variable()或sql:column()]…愉快的编码!谢谢你,伙计。这个sln适用于原始帖子中的字符串。但是当我添加另一个“节点”(我想根级别的节点是正确的术语?!),它不会给我任何输出。请尝试在分号后的最后一行
交叉应用…
中设置根元素的名称。节点沿路径(称为“XPATH”)读取,此路径以您的根开始…如果我将最后一行更改为“交叉应用@XML.nodes('declare namespace DTS=”“;/DTS:Executable/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager')作为y(vals)”,它仍然没有给出任何输出(我还在上一行添加了它,也没有输出):(有两个分号吗?应该是
“declare namespace DTS=”http://DTS“;/DTS:Executable/…
@007,您可以使用带方括号的XPath筛选器:使用“/root[1]/row[3]/item[@attr='test']”可以找到属性为“attr”的项,属性值为“test”,位于第三行。您还可以做更多的事情:某些函数、逻辑表达式、外部变量的使用[查找sql:variable()或者sql:column()]…编码很愉快!谢谢你,我不知道你可以将两者混合使用。你每天都能学到一些东西。谢谢你的增强。我尝试修改最后一行,将@XML.nodes('/DTS:Executable/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager')交叉应用为y(vals),但仍然没有给出任何输出(请发布您的新XML更新了原始帖子。ThxAhh,明白了!我必须使用(新列出的)名称空间。谢谢各位!谢谢你们!谢谢你们,我不知道你们可以混合使用这两个名称空间。你们每天都会学到一些东西。谢谢你们的增强。我尝试修改最后一行以交叉应用@XML.nodes('/DTS:Executable/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager')作为y(VAL),但仍然没有给出任何输出。:(请发布新的XML更新了原始帖子。ThxAhh,明白了!我必须使用(新列出的)命名空间。谢谢大家!很好的概述!我在很多情况下喜欢纯SQL的一个原因是:您可以在(裸)报告和应用程序中使用相同的功能。很好的概述!我在很多情况下喜欢纯SQL的一个原因是:您可以在(裸)报告和应用程序中使用相同的功能。
-- Some XML
'<DTS:ConnectionManager DTS:refId="Package.ConnectionManagers[MTS]" DTS:CreationName="FLATFILE" DTS:DTSID="{296732CC-7D91-4E49-ACD4-384E03BC032E}" DTS:ObjectName="MTS">
    <DTS:PropertyExpression DTS:Name="ConnectionString">@Something</DTS:PropertyExpression>
    <DTS:ObjectData>
        <DTS:ConnectionManager DTS:Format="Delimited" DTS:LocaleID="1033" DTS:HeaderRowDelimiter="_x000D__x000A_" DTS:ColumnNamesInFirstDataRow="True" DTS:RowDelimiter="" DTS:TextQualifier="_x0022_" DTS:CodePage="1252" DTS:ConnectionString="C:\Folder\\File.csv">
            <DTS:FlatFileColumns>
                <DTS:FlatFileColumn DTS:ColumnType="Delimited" DTS:ColumnDelimiter="_x002C_" DTS:MaximumWidth="50" DTS:DataType="129" DTS:TextQualified="True" DTS:ObjectName="MC" DTS:DTSID="{E87E7707-B7F7-4EC6-A2CB-98AD637A3985}" DTS:CreationName="" />
                <DTS:FlatFileColumn DTS:ColumnType="Delimited" DTS:ColumnDelimiter="_x002C_" DTS:DataType="6" DTS:TextQualified="True" DTS:ObjectName="PP" DTS:DTSID="{C7B97962-3B43-40C5-82B1-F6136906CD84}" DTS:CreationName="" />
            </DTS:FlatFileColumns>
        </DTS:ConnectionManager>
    </DTS:ObjectData>
</DTS:ConnectionManager>'
-- Some more XML
CreationName    ObjectName  ConnectionString        MaximumWidth    DataType    FieldName
FLATFILE        MTS         C:\Folder\\File.csv     50              129         MC
FLATFILE        MTS         C:\Folder\\File.csv     NULL            6           PP
CreationName - DTS:CreationName from DTS:ConnectionManager. i.e. FLATFILE
ObjectName - DTS:ObjectName from DTS:ConnectionManager. i.e. MTS
ConnectionString - DTS:ConnectionString from DTS:ObjectData\DTS:ConnectionManager. i.e. "C:\Folder\\File.csv"
MaximumWidth - DTS:MaximumWidth from DTS:FlatFileColumns i.e. 50 -- NOTE: MaximumWidth might not always exist
DataType - DTS:DataType from DTS:FlatFileColumns i.e. 129
FieldName - DTS:ObjectName from DTS:FlatFileColumns i.e. MC
    <DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts" DTS:refId="P" DTS:CreationDate="10/01/2015 12:00:00">
  <DTS:ConnectionManagers>
    <DTS:ConnectionManager DTS:refId="Package.ConnectionManagers[FF]" DTS:CreationName="FLATFILE" DTS:DTSID="{123}" DTS:ObjectName="FF">
      <DTS:ObjectData>
        <DTS:ConnectionManager DTS:Format="Delimited" DTS:LocaleID="1033" DTS:HeaderRowDelimiter="_x000D__x000A_" DTS:ColumnNamesInFirstDataRow="True" DTS:RowDelimiter="" DTS:TextQualifier="_x0022_" DTS:CodePage="1252" DTS:ConnectionString="Test.csv">
          <DTS:FlatFileColumns>
            <DTS:FlatFileColumn DTS:ColumnType="Delimited" DTS:ColumnDelimiter="_x002C_" DTS:DataType="11" DTS:TextQualified="True" DTS:ObjectName="TestCN" DTS:DTSID="{012}" DTS:CreationName="" />
          </DTS:FlatFileColumns>
        </DTS:ConnectionManager>
      </DTS:ObjectData>
    </DTS:ConnectionManager>
    <DTS:ConnectionManager DTS:refId="Package.ConnectionManagers[FF2]" DTS:CreationName="FLATFILE" DTS:DTSID="{123}" DTS:ObjectName="FF2">
      <DTS:ObjectData>
        <DTS:ConnectionManager DTS:Format="Delimited" DTS:LocaleID="1033" DTS:HeaderRowDelimiter="_x000D__x000A_" DTS:ColumnNamesInFirstDataRow="True" DTS:RowDelimiter="" DTS:TextQualifier="_x0022_" DTS:CodePage="1252" DTS:ConnectionString="Test2.csv">
          <DTS:FlatFileColumns>
            <DTS:FlatFileColumn DTS:ColumnType="Delimited" DTS:ColumnDelimiter="_x002C_" DTS:DataType="11" DTS:TextQualified="True" DTS:ObjectName="TestCN2" DTS:DTSID="{012}" DTS:CreationName="" />
          </DTS:FlatFileColumns>
        </DTS:ConnectionManager>
      </DTS:ObjectData>
    </DTS:ConnectionManager>
  </DTS:ConnectionManagers>
</DTS:Executable>
DECLARE @XML XML = '
<DTS:Executable xmlns:DTS="www.microsoft.com/SqlServer/Dts" DTS:refId="P" DTS:CreationDate="10/01/2015 12:00:00">
  <DTS:ConnectionManagers>
    <DTS:ConnectionManager DTS:refId="Package.ConnectionManagers[FF]" DTS:CreationName="FLATFILE" DTS:DTSID="{123}" DTS:ObjectName="FF">
      <DTS:ObjectData>
        <DTS:ConnectionManager DTS:Format="Delimited" DTS:LocaleID="1033" DTS:HeaderRowDelimiter="_x000D__x000A_" DTS:ColumnNamesInFirstDataRow="True" DTS:RowDelimiter="" DTS:TextQualifier="_x0022_" DTS:CodePage="1252" DTS:ConnectionString="Test.csv">
          <DTS:FlatFileColumns>
            <DTS:FlatFileColumn DTS:ColumnType="Delimited" DTS:ColumnDelimiter="_x002C_" DTS:DataType="11" DTS:TextQualified="True" DTS:ObjectName="TestCN" DTS:DTSID="{012}" DTS:CreationName="" />
          </DTS:FlatFileColumns>
        </DTS:ConnectionManager>
      </DTS:ObjectData>
    </DTS:ConnectionManager>
  </DTS:ConnectionManagers>
</DTS:Executable>'
;

WITH XMLNAMESPACES (N'www.microsoft.com/SqlServer/Dts' as DTS )
SELECT 
    y.vals.query('.') AS NodesAsExtracted
,   x.vals.value('@DTS:CreationName', 'Varchar(255)') AS CreationName
,   x.vals.value('@DTS:ObjectName', 'Varchar(255)') AS ObjectName
,   y.vals.value('@DTS:ConnectionString', 'Varchar(255)') AS ConnectionString
,   x.vals.value('@DTS:ColumnType', 'Varchar(255)') AS ColumnType
,   x.vals.value('@DTS:MaximumWidth', 'Varchar(255)') AS MaximumWidth
FROM @XML.nodes('/DTS:Executable/DTS:ConnectionManagers/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager') AS y(vals)
    CROSS APPLY @XML.nodes('/DTS:Executable/DTS:ConnectionManagers/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn') AS x(vals)


/*
The key piece is you are extracting data with a namespace, which makes things harder when querying.
You need to repeat certain 'nodes' so there is a syntax for that called originally enough 'nodes' that breaks up a 3d object like xml into multiple bits
I do one for the high level and one for the lower and then cross apply them which really is a whole world into itself I won't mention here
It should be represented as a parent 'x' and the values found 'vals'
I showed an example as is first when I query '('.')' which is everything in essence.
My namespace declaration must match on the xml that exists and the declaration.

more on nodes https://msdn.microsoft.com/en-us/library/ms188282.aspx
more on query https://msdn.microsoft.com/en-us/library/ms191474.aspx
more on value https://msdn.microsoft.com/en-us/library/ms178030.aspx
*/
WITH XMLNAMESPACES (N'http://DTS' as DTS )
SELECT 
    x.vals.query('.') AS NodesAsExtracted
,   x.vals.value('@DTS:CreationName', 'Varchar(255)') AS CreationName
,   x.vals.value('@DTS:ObjectName', 'Varchar(255)') AS ObjectName
,   y.vals.value('@DTS:ConnectionString', 'Varchar(255)') AS ConnectionString
,   x.vals.value('@DTS:ColumnType', 'Varchar(255)') AS ColumnType
,   x.vals.value('@DTS:MaximumWidth', 'Varchar(255)') AS MaximumWidth
from @XML.nodes('/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn') AS x(vals)
    CROSS APPLY @XML.nodes('/DTS:ConnectionManager/DTS:ObjectData/DTS:ConnectionManager') AS y(vals) 
import os
import lxml.etree as ET

cd = os.path.dirname(os.path.abspath(__file__))

xmlfile = 'DTSfile.xml'
dom = ET.parse(os.path.join(cd, xmlfile))
root = dom.getroot()

nodexpath = dom.xpath("//DTS:ConnectionManager", namespaces=root.nsmap)
dataline = []

def checkPath(xpathstr):    
    if dom.xpath(xpathstr, namespaces=root.nsmap) == []:
        return ''
    else:
        return dom.xpath(xpathstr, namespaces=root.nsmap)[0]

for i in range(1,len(nodexpath)+1):
    if i % 2 == 0: continue

    dataline = []    
    dataline.append(checkPath('//DTS:ConnectionManager[{0}]/@DTS:CreationName'.format(i)))
    dataline.append(checkPath('//DTS:ConnectionManager[{0}]/@DTS:ObjectName'.format(i)))
    dataline.append(checkPath('//DTS:ConnectionManager[{0}]/DTS:ObjectData/DTS:ConnectionManager/@DTS:ConnectionString'.format(i)))    
    dataline.append(checkPath('//DTS:ConnectionManager[{0}]/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:MaximumWidth'.format(i)))
    dataline.append(checkPath('//DTS:ConnectionManager[{0}]/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:DataType'.format(i)))
    dataline.append(checkPath('//DTS:ConnectionManager[{0}]/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:ObjectName'.format(i)))

    print(dataline)

['FLATFILE', 'FF', 'Test.csv', '', '11', 'TestCN']
['FLATFILE', 'FF2', 'Test2.csv', '', '11', 'TestCN2']
$cd = dirname(__FILE__);

$xml = simplexml_load_file($cd.'/DTSfile.xml');
$xml->registerXPathNamespace('DTS', 'www.microsoft.com/SqlServer/Dts');

$values = [];
$node = $xml->xpath('//DTS:ConnectionManager');

function checkPath($xml, $xpathstr) {         
     $path = $xml->xpath($xpathstr);
     foreach ($path as $value) {
      if (count($path) > 0) {
           foreach($path as $value) {           
           return $value;         
           }
      }   
      else {
           return '';
      }       
     }         
}
$i = 1;

foreach ($node as $n){         
     $values[] = checkPath($xml, '//DTS:ConnectionManager['.$i.']/@DTS:CreationName');
     $values[] = checkPath($xml, '//DTS:ConnectionManager['.$i.']/@DTS:ObjectName');
     $values[] = checkPath($xml, '//DTS:ConnectionManager['.$i.']/DTS:ObjectData/DTS:ConnectionManager/@DTS:ConnectionString');    
     $values[] = checkPath($xml, '//DTS:ConnectionManager['.$i.']/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:MaximumWidth');
     $values[] = checkPath($xml, '//DTS:ConnectionManager['.$i.']/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:DataType');
     $values[] = checkPath($xml, '//DTS:ConnectionManager['.$i.']/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:ObjectName');     

     if ($values[1] != "") {
      echo implode(", ", $values)."\n";
     }
     $i++;
     $values = [];         
}

FLATFILE, FF, Test.csv, , 11, TestCN
FLATFILE, FF2, Test2.csv, , 11, TestCN2
library(XML) 

setwd("C:\\Path\\To\\Working\\Directory")

doc<-xmlParse("DTSfile.xml")

nodes <- as.list(xpathSApply(doc, '//DTS:ConnectionManager'))

checkPath <- function (xpathstr) {
  if (length(as.list(xpathSApply(doc, xpathstr))) > 0) {
    return(as.list(xpathSApply(doc, xpathstr)))
  } else {
    return("")
  }
}

for (i in (1:length(nodes))) {  
  if (i %% 2) {
    data <- checkPath(sprintf('//DTS:ConnectionManager[%d]/@DTS:CreationName', i))
    data <- append(data, checkPath(sprintf('//DTS:ConnectionManager[%d]/@DTS:ObjectName', i)))
    data <- append(data, checkPath(sprintf('//DTS:ConnectionManager[%d]/DTS:ObjectData/DTS:ConnectionManager/@DTS:ConnectionString', i)))
    data <- append(data, checkPath(sprintf('//DTS:ConnectionManager[%d]/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:MaximumWidth', i)))
    data <- append(data, checkPath(sprintf('//DTS:ConnectionManager[%d]/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:DataType', i)))
    data <- append(data, checkPath(sprintf('//DTS:ConnectionManager[%d]/DTS:ObjectData/DTS:ConnectionManager/DTS:FlatFileColumns/DTS:FlatFileColumn/@DTS:ObjectName', i)))

    print(paste(data, collapse = ', '))
  }

}

[1] "FLATFILE, FF, Test.csv, , 11, TestCN"
[1] "FLATFILE, FF2, Test2.csv, , 11, TestCN2"