首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >强制在xml文档中的所有xml元素上添加前缀

强制在xml文档中的所有xml元素上添加前缀
EN

Stack Overflow用户
提问于 2015-08-05 05:36:54
回答 1查看 636关注 0票数 0

我已经检查并尝试了这个问题的多种解决方案,但仍然不能正常工作。

我从数据集(从Excel文件填充)创建一个XML文件。该文件工作正常,我已经根据XSD对其进行了验证。我剩下的唯一问题是,在根元素中定义的名称空间前缀没有出现在XMLDocument中的任何元素中。下面是生成XMLDocument的代码(注意- partDS是从中加载XML文件的数据集):

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
<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"),但没有返回任何内容。

很抱歉,这篇文章太长了,但我只是想确认我有足够的信息。感谢所有评论这篇文章的人。

EN

Stack Overflow用户

发布于 2015-08-07 03:07:23

直到我深入研究了一下,我才意识到Sam Axe是什么意思(如果可以的话,我会支持你的评论)。最后,我没有意识到我可以更改数据集中数据列的前缀,使其与根中声明的名称空间相关联:

代码语言:javascript
运行
复制
    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"

非常感谢你的帮助。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31819795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档