我已经检查并尝试了这个问题的多种解决方案,但仍然不能正常工作。
我从数据集(从Excel文件填充)创建一个XML文件。该文件工作正常,我已经根据XSD对其进行了验证。我剩下的唯一问题是,在根元素中定义的名称空间前缀没有出现在XMLDocument中的任何元素中。下面是生成XMLDocument的代码(注意- partDS是从中加载XML文件的数据集):
Private Sub WriteXML_Click(sender As Object, e As EventArgs) Handles Writer.Click
Dim fName As String = "C:\Users\ThisUser\Desktop\Plain.xml"
partDS.DataSetName = "XMLDataDelivery"
partDS.WriteXml(fName)
Dim xDoc As New XmlDocument
Dim schemaLocation As XmlAttribute = Nothing
Dim schemaString As String = "http://www.w3.org/2001/XMLSchema-instance"
Dim schemaValue As String = "http://www.tgin.org/trident/7143706-001 7143706-001RevA.xsd"
Dim namespaceAttribute As XmlAttribute = Nothing
Dim nsString As String = "http://www.w3.org/2000/xmlns/"
Dim nsValue As String = "http://www.tgin.org/trident/7143706-001"
Dim commonTimeElement As XmlElement = Nothing
Dim commonTimeAttribute As XmlAttribute = Nothing
Dim commonTimeString As String = "/XMLDataDelivery/CommonHeader/SubmittedDateTimeUTC"
Dim dataTimeElement As XmlElement = Nothing
Dim dataTimeAttribute As XmlAttribute = Nothing
Dim dataTimeString As String = "/XMLDataDelivery/Data/LogisticsEvent/DateTime"
Dim timeAttributeString = "dl:DateTime12HourWithoutFeb29"
Dim dateTimeNodeList As XmlNodeList = Nothing
Dim parentLevels As XmlNodeList = xDoc.SelectNodes("/XMLDataDelivery/Data/LogisticsEvent")
Dim higherLevels As XmlNodeList = xDoc.SelectNodes("/XMLDataDelivery/Data/LogisticsEvent/Activity")
Dim partLevels As XmlNodeList = xDoc.SelectNodes("/XMLDataDelivery/Data/LogisticsEvent/AssemblyItem")
xDoc.Load(fName)
'define XML namespace and attributes in XML header
namespaceAttribute = xDoc.CreateAttribute("xmlns", "dl", nsString)
namespaceAttribute.Value = nsValue
xDoc.DocumentElement.Attributes.Append(namespaceAttribute)
schemaLocation = xDoc.CreateAttribute("xsi", "schemaLocation", schemaString)
schemaLocation.Value = schemaValue
xDoc.DocumentElement.SetAttributeNode(schemaLocation)
'define and set attributes for the dateTime elements in the XML
commonTimeElement = xDoc.SelectSingleNode(commonTimeString)
commonTimeAttribute = xDoc.CreateAttribute("xsi", "type", schemaString)
commonTimeAttribute.Value = timeAttributeString
commonTimeElement.SetAttributeNode(commonTimeAttribute)
dataTimeAttribute = xDoc.CreateAttribute("xsi", "type", schemaString)
dataTimeAttribute.Value = timeAttributeString
Dim i As Integer = 0
Do Until i > parentLevels.Count - 1
parentLevels.ItemOf(i).InsertBefore(partLevels.ItemOf(i), higherLevels.ItemOf(i))
i += 1
Loop
dateTimeNodeList = xDoc.SelectNodes("/XMLDataDelivery/Data/LogisticsEvent/DateTime")
For Each item As XmlElement In dateTimeNodeList
item.SetAttribute("type", schemaString, timeAttributeString)
Next
xDoc.Save(fName)
End Sub它会生成类似于下面的XML:
<XMLDataDelivery xmlns:dl="http://www.tgin.org/trident/7143706-001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tgin.org/trident/7143706-001 7143706-001RevA.xsd">
<Data>
<Location>Site01</Location>
<LogisticsEvent>
<DateTime>01-JUL-2015 12:00:00 PM</DateTime>
<AssemblyItem>
<ProductName>Test Part1</ProductName>
<ProductNumber>998741</ProductNumber>
<ProductDash>050</ProductDash>
<SerialNumber>LX2247</SerialNumber>
<ProductRevision>R</ProductRevision>
</AssemblyItem>
<Activity>Stat Change</Activity>
<Condition>Good</Condition>
<Usage>Production</Usage>
<LogisticsEvent>
</Data>
</XMLDataDelivery>现在,根据我的研究(仍然是用vb.net编程XML的新手),如果名称空间是在根中定义的,那么相同名称空间的前缀不需要(或者不需要?)显示在XMLDocument中的每个节点上。
虽然我同意这一点(并且我的验证器同意这是一个有效的XML文件),但是如果没有在每个节点上附加前缀,那么这些文件将被上传到的系统将无法通过验证。
我尝试了多种修复方法,从简单地定义根前缀(xDoc.DocumentElement.prefix = "dl")到尝试不同的属性设置,使用名称空间管理器,但仍然没有得到任何结果。
XML文件是从头开始创建的(不是从任何模板加载的)。我确实尝试了命令xDoc.GetNamespaceOfPrefix("dl"),但没有返回任何内容。
很抱歉,这篇文章太长了,但我只是想确认我有足够的信息。感谢所有评论这篇文章的人。
发布于 2015-08-07 03:07:23
直到我深入研究了一下,我才意识到Sam Axe是什么意思(如果可以的话,我会支持你的评论)。最后,我没有意识到我可以更改数据集中数据列的前缀,使其与根中声明的名称空间相关联:
partDS.Tables("CommonHeader").Prefix = "dl"
partDS.Tables("DataHeader").Prefix = "dl"
partDS.Tables("Data").Prefix = "dl"
partDS.Tables("LogisticsEvent").Prefix = "dl"
partDS.Tables("AssemblyItem").Prefix = "dl"
Dim logCol As Integer = 0
Dim assyCol As Integer = 0
Do Until logCol > partDS.Tables("LogisticsEvent").Columns.Count - 1
partDS.Tables("LogisticsEvent").Columns(logCol).Prefix = "dl"
logCol += 1
Loop
Do Until assyCol > partDS.Tables("AssemblyItem").Columns.Count - 1
partDS.Tables("AssemblyItem").Columns(assyCol).Prefix = "dl"
assyCol += 1
Loop
partDS.DataSetName = "XMLDataDelivery"
partDS.Namespace = "http://www.tgin.org/trident/7143706-001"
partDS.Prefix = "dl"非常感谢你的帮助。
https://stackoverflow.com/questions/31819795
复制相似问题