【发布时间】:2016-02-17 19:09:29
【问题描述】:
我正在尝试使用 System.Xml.Linq 将数据集的值输出到 xml 文档,但是每个元素的值在每个数据集元素中重复三次,而不是只有一个
要遍历数据集并转换我正在使用此代码的 xml
Dim variableList As New List(Of String)()
Dim rowList As New List(Of String)()
For Each column As DataColumn In ds.Tables(0).Columns
variableList.Add(column.ColumnName)
Dim variables As XElement = doc.Descendants().Where(Function(x) x.Name.LocalName = "variables").FirstOrDefault
Dim variable As XElement = <variable varName=<%= column.ColumnName %> trait="textcontent" category="ns_flows;"></variable>
variables.Add(variable)
For Each dr As DataRow In ds.Tables(0).Rows
rowList.Add(dr.Item(column))
Dim sampleDataSets As XElement = doc.Descendants().Where(Function(x) x.Name.LocalName = "sampleDataSet").FirstOrDefault()
Dim newEle As XElement = <<%= column.ColumnName %>><p><%= dr.Item(column) %></p></>
sampleDataSets.Add(newEle)
Next
Next
For Each dataRow As DataRow In ds.Tables(0).Rows
Dim strDatasheet As String = dataRow("Dataset").ToString
Dim sampleDataSets As XElement = doc.Descendants().Where(Function(x) x.Name.LocalName = "sampleDataSet").FirstOrDefault()
Dim ns_v As XNamespace = sampleDataSets.GetNamespaceOfPrefix("v")
Dim dataSetName As XAttribute = doc.Descendants().Where(Function(x) x.Name.LocalName = "sampleDataSet").FirstOrDefault().Attribute("dataSetName")
dataSetName.SetValue(strDatasheet)
Dim dataset As XElement = doc.Descendants().Where(Function(x) x.Name.LocalName = "Dataset").FirstOrDefault()
Dim ns_dataset As XNamespace = dataset.Name.Namespace
sampleDataSets.AddAfterSelf(sampleDataSets)
Dim number As Integer
number += 1
If number = ds.Tables(0).Rows.Count Then
sampleDataSets.Remove()
dataSetName.Remove()
End If
Next
这将输出以下 XMLDocument
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd"[
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
]>
<svg>
<variableSets xmlns="ns_vars;">
<variableSet varSetName="binding1" locked="none">
<variables>
<variable varName="Dataset" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Name" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Rev" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Desc" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Marketing" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Project" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="DPN" trait="textcontent" category="ns_flows;" xmlns=""></variable>
</variables>
<v:sampleDataSets xmlns:v="http://ns.adobe.com/Variables/1.0/" xmlns="http://ns.adobe.com/GenericCustomNamespace/1.0/">
<v:sampleDataSet dataSetName="0FFHH A00_(Glasgow).ai">
<Dataset xmlns="">
<p>0FFHH A00_(Glasgow).ai</p>
</Dataset>
<Dataset xmlns="">
<p>07FV6 A00_(Munster).ai</p>
</Dataset>
<Dataset xmlns="">
<p>0C11F A00_(London).ai</p>
</Dataset>
<Name xmlns="">
<p>0FFHH</p>
</Name>
<Name xmlns="">
<p>0C11F</p>
</Name>
<Name xmlns="">
<p>07FV6</p>
</Name>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Marketing xmlns="">
<p>E7270 </p>
</Marketing>
<Marketing xmlns="">
<p>15011</p>
</Marketing>
<Marketing xmlns="">
<p>15001</p>
</Marketing>
<Project xmlns="">
<p>Creek 12</p>
</Project>
<Project xmlns="">
<p>Creek 12 </p>
</Project>
<Project xmlns="">
<p>Creek 12 </p>
</Project>
<DPN xmlns="">
<p>DP/N: 1234</p>
</DPN>
<DPN xmlns="">
<p>DP/N: 5345</p>
</DPN>
<DPN xmlns="">
<p>DP/N: 35345</p>
</DPN>
</v:sampleDataSet>
<v:sampleDataSet dataSetName="07FV6 A00_(Munster).ai">
<Dataset xmlns="">
<p>0FFHH A00_(Glasgow).ai</p>
</Dataset>
<Dataset xmlns="">
<p>07FV6 A00_(Munster).ai</p>
</Dataset>
<Dataset xmlns="">
<p>0C11F A00_(London).ai</p>
</Dataset>
<Name xmlns="">
<p>0FFHH</p>
</Name>
<Name xmlns="">
<p>0C11F</p>
</Name>
<Name xmlns="">
<p>07FV6</p>
</Name>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Marketing xmlns="">
<p>15021</p>
</Marketing>
<Marketing xmlns="">
<p>L15011</p>
</Marketing>
<Marketing xmlns="">
<p> 15001</p>
</Marketing>
<Project xmlns="">
<p>Creek 12 </p>
</Project>
<Project xmlns="">
<p>Creek 12 </p>
</Project>
<Project xmlns="">
<p>Creek 12 </p>
</Project>
<DPN xmlns="">
<p>DP/N:456456</p>
</DPN>
<DPN xmlns="">
<p>DP/N: 4564</p>
</DPN>
<DPN xmlns="">
<p>DP/N: 456</p>
</DPN>
</v:sampleDataSet>
<v:sampleDataSet dataSetName="0C11F A00_(London).ai">
<Dataset xmlns="">
<p>0FFHH A00_(Glasgow).ai</p>
</Dataset>
<Dataset xmlns="">
<p>07FV6 A00_(Munster).ai</p>
</Dataset>
<Dataset xmlns="">
<p>00C11F A00_(London).ai</p>
</Dataset>
<Name xmlns="">
<p>0FFHH</p>
</Name>
<Name xmlns="">
<p>0C11F</p>
</Name>
<Name xmlns="">
<p>07FV6</p>
</Name>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Marketing xmlns="">
<p>15021</p>
</Marketing>
<Marketing xmlns="">
<p>15011</p>
</Marketing>
<Marketing xmlns="">
<p>15001</p>
</Marketing>
<Project xmlns="">
<p>Creek 12 </p>
</Project>
<Project xmlns="">
<p>Creek 12 </p>
</Project>
<Project xmlns="">
<p> Creek 12 </p>
</Project>
<DPN xmlns="">
<p>DP/N: 565465</p>
</DPN>
<DPN xmlns="">
<p>DP/N: 6456</p>
</DPN>
<DPN xmlns="">
<p>DP/N: 4564</p>
</DPN>
</v:sampleDataSet>
</v:sampleDataSets>
</variableSet>
</variableSets>
</svg>
在将下一个元素写入 xml 文档之前,代码似乎迭代了 3 次,谁能提供任何关于我哪里出错的建议,文档应该类似于以下格式。
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd"[
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
]>
<svg>
<variableSets xmlns="ns_vars;">
<variableSet varSetName="binding1" locked="none">
<variables>
<variable varName="Dataset" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Name" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Rev" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Desc" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Marketing" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="Project" trait="textcontent" category="ns_flows;" xmlns=""></variable>
<variable varName="DPN" trait="textcontent" category="ns_flows;" xmlns=""></variable>
</variables>
<v:sampleDataSets xmlns:v="http://ns.adobe.com/Variables/1.0/" xmlns="http://ns.adobe.com/GenericCustomNamespace/1.0/">
<v:sampleDataSet dataSetName="0FFHH A00_(Glasgow).ai">
<Dataset xmlns="">
<p>0FFHH A00_(Glasgow).ai</p>
</Dataset>
<Name xmlns="">
<p>0FFHH</p>
</Name>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Marketing xmlns="">
<p> E7270 </p>
</Marketing>
<Project xmlns="">
<p> Creek 12 </p>
</Project>
<DPN xmlns="">
<p>DP/N:3424</p>
</DPN>
</v:sampleDataSet>
<v:sampleDataSet dataSetName=">07FV6 A00_(Munster).ai">
<Dataset xmlns="">
<p>07FV6 A00_(Munster).ai</p>
</Dataset>
<Name xmlns="">
<p>07FV6</p>
</Name>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Desc xmlns="">
<p>ESPL</p>
</Desc>
<Marketing xmlns="">
<p> E7270 </p>
</Marketing>
<Project xmlns="">
<p> Creek 12 </p>
</Project>
<DPN xmlns="">
<p>DP/N: 2167</p>
</DPN>
</v:sampleDataSet>
<v:sampleDataSet dataSetName="0C11F A00_(London).ai">
<Dataset xmlns="">
<p>0C11F A00_(London).ai</p>
</Dataset>
<Name xmlns="">
<p>07FV6</p>
</Name>
<Rev xmlns="">
<p>A00</p>
</Rev>
<Desc xmlns="">
<p>ESPL,</p>
</Desc>
<Marketing xmlns="">
<p> E7270 </p>
</Marketing>
<Project xmlns="">
<p> Creek 12 </p>
</Project>
<DPN xmlns="">
<p>DP/N:65756</p>
</DPN>
</v:sampleDataSet>
</variableSet>
</variableSets>
</svg>
更新 Jdweng 的回答是正确的,我在下面展示了正确的代码,只遍历数据行一次。
For Each dataRow As DataRow In result.Tables(0).Rows
If Not dataRow Is Nothing Then
Dim strDatasheet As String = dataRow(variableList.Item(0)).ToString
Dim sampleDataSets As XElement = doc.Descendants().Where(Function(x) x.Name.LocalName = "sampleDataSet").LastOrDefault
Dim dataSetName As XAttribute = doc.Descendants().Where(Function(x) x.Name.LocalName = "sampleDataSet").LastOrDefault.Attribute("dataSetName")
dataSetName.SetValue(strDatasheet)
sampleDataSets.AddAfterSelf(sampleDataSets)
For Each item In variableList
Dim ns_v1 As XNamespace = sampleDataSets.GetDefaultNamespace()
Dim itemElement As XElement = New XElement(ns_v1 + item)
Dim dataEle As XElement = New XElement(<p><%= dataRow(item).ToString %></p>)
sampleDataSets.Add(itemElement)
itemElement.Add(dataEle)
For Each node As XElement In sampleDataSets.Descendants()
If node.Name.NamespaceName = "" Then
node.Attributes("xmlns").Remove()
node.Name = node.Parent.Name.[Namespace] + node.Name.LocalName
End If
Next
Next
End If
Next
【问题讨论】:
-
在没有数据集的情况下确定原因非常棘手,因为我无法重现问题。如果您可以简化示例并提供可重现的问题,我将很乐意提供帮助。
-
简单。当您遍历列以获取列名时,仅对第 0 行执行此操作。您正在遍历每一行,因此列名重复 3 倍,因为您有三行。
-
感谢 jdweng 修复了问题。