xml - XML 输出是复制记录 VB.NET
问题描述
我是新编程人员,所以如果您的回复简单且使用相同的语言,我将不胜感激。我正在处理更改我的 CAD 应用程序发明者的文件名系统。我开发了这些简单的代码行来使用数据集进行读写,数据集是一个存储 PrefixValues 和文件序列的 xml 文件。
为了生成新号码,我有一个控制所有事件的类,并调用我的其他类和子例程来生成通过引用传递的号码。
对于不同的文件,一切似乎都很好,但是,当我处理大量保存时,比如打开三个文件并为每个文件生成数字,输出严重重复了我的记录,我不知道应该怎么做才能避免这个问题。这是代码的一部分。
Public Class NumberGenerator
Dim invPresetsPath As String = g_inventorApplication.FileLocations.PresetsPath
Dim xmlPrefixPath = invPresetsPath & "\" & "xmlPrefixPath.xml"
Dim DatSet As New ConfigDataSet
Sub NonDrawingNumberGen(ByRef NonDrawingNumber As String)
If My.Computer.FileSystem.FileExists(xmlPrefixPath) = True Then
DatSet.ReadXml(xmlPrefixPath)
End If
' First item from Row means the index and Second Item Means the Column 2 is the Non Drawing Number
' ***************************** ASSY AND PART NUMBER READ AND WRITE A NEW NUMBER ***************************
Dim TblNonDrawNumber As Integer = DatSet.Tables("NumberingTable").Rows(My.Settings.PrefixID)(2)
Dim NonDrNumber As String = TblNonDrawNumber.ToString("D7")
NonDrawingNumber = My.Settings.PrefixSet & "-" & NonDrNumber
' Replace the XML File current value Adding a New Value
DatSet.Tables("NumberingTable").Rows(My.Settings.PrefixID)(2) = TblNonDrawNumber + 1
DatSet.WriteXml(xmlPrefixPath)
End Sub
这是主类中调用前面代码的子程序。
Public Sub m_fileUIEvents_OnPopulateFileMetadata(ByVal FileMetadataObjects As Inventor.ObjectsEnumerator, ByVal Formulae As String, ByVal Context As Inventor.NameValueMap, ByRef HandlingCode As Inventor.HandlingCodeEnum) Handles m_FileUIEvents.OnPopulateFileMetadata
For PartMakeComponentsCmd
If Context.Item(1) = "PartMakeComponentsCmd" Or Context.Item(1) = "PartMakePartCmd" Then
'does the verification of the extension
oMetadata = DirectCast(FileMetadataObjects.Item(1), FileMetadata)
CurrentName = oMetadata.FullFileName
FileExtension = Right(CurrentName, 3)
If FileExtension = "iam" Then
oMetadata = DirectCast(FileMetadataObjects.Item(1), FileMetadata)
Dim GenNumber As String
NumbGen.NonDrawingNumberGen(GenNumber)
oMetadata.FullFileName = oPath & GenNumber
oMetadata.DisplayName = GenNumber
oMetadata.TemplateFileName = "Assembly.aim"
oMetadata.DisplayNameOverridden = False
oMetadata.FileNameOverridden = True
HandlingCode = HandlingCodeEnum.kEventHandled
ElseIf FileExtension = "ipt" Then
'This section tries to duplicate the record
For Each oMetadata In FileMetadataObjects
Dim GenNumber As String
NumbGen.NonDrawingNumberGen(GenNumber)
oMetadata.DisplayName = GenNumber
oMetadata.DisplayNameOverridden = True
oMetadata.FileName = oPath & GenNumber
oMetadata.FileNameOverridden = True '*
Next
HandlingCode = HandlingCodeEnum.kEventHandled
End If
'Termination that defines that this only works for PartMakeComponents Command!`
End If
' ******************************** PART MAKE COMPONENTS END ***********************************************
这是我的 xml 文件的结构。我不知道 tempuri org 是什么意思,但它是用我在 Visual Basic 中的类型数据集创建的。
<?xml version="1.0" standalone="yes"?>
<ConfigDataSet xmlns="http://tempuri.org/ConfigDataSet.xsd">`
<NumberingTable>
<PrefixID>0</PrefixID>
<PrefixValue>61-03</PrefixValue>
<AssyPartCountValue>2</AssyPartCountValue>
<DrawingValue>0</DrawingValue>
<DescriptionValue>Test Record</DescriptionValue>
</NumberingTable>
<NumberingTable>
<PrefixID>1</PrefixID>
<PrefixValue>61-02</PrefixValue>
<AssyPartCountValue>5</AssyPartCountValue>
<DrawingValue>0</DrawingValue>
<DescriptionValue>This is another test description</DescriptionValue>
</NumberingTable>
</ConfigDataSet>
谢谢你的帮助。
解决方案
绝对正确,Dataset 无法处理大量保存选项,也无法处理数据行或数据表。我不得不以艰难的方式做到这一点,它是通过直接编辑 xml,因为它是任何简单的文档。这是代码,我知道它可以简化。但它对我来说非常棒而且超级快。头痛 3 天。
`Dim docPrefixSettings As XmlDocument = New XmlDocument`
`docPrefixSettings.Load(xmlPrefixPath)`
' Selects the root of the XML
`Dim elm As XmlElement = docPrefixSettings.DocumentElement`
' Selects the Row Item in this case is the defined by the selected settings
`Dim Table As XmlNodeList = elm.ChildNodes`
`Dim Values As XmlNode = Table.Item(My.Settings.PrefixID)`
' Selects the Item inside the Row
`Dim AssyCurrentValue As XmlNode = Values.ChildNodes.Item(2)`
' Selects the Variable CurrentValue and Assigns the Value of the Inner Text
`Dim CurrentValue As Integer = AssyCurrentValue.InnerText`
' Defines the String in Formated Number for the Obtained Value
`Dim NonDrNumber As String = CurrentValue.ToString("D7")`
' THIS IS THE PART OR ASSEMBLY NUMBER!!!!!
`NonDrawingNumber = My.Settings.PrefixSet & "-" & NonDrNumber`
' Changing the old value and adding 1
' Defines the new Value for the current Assy or Part Number
`Dim NewValue As Integer = AssyCurrentValue.InnerText + 1`
'Sets the value to be use in the following one
`AssyCurrentValue.InnerText = NewValue`
'Saves the Document with this new value
`docPrefixSettings.Save(xmlPrefixPath)`
推荐阅读
- java - 如何在自定义创建的视图上显示一个简单的 ImageButton?
- reactjs - 何时评估函数中定义的组件?(反应钩子)
- css - 使用父选择器减少多个类规则
- python - 使用带有条件逻辑的 numpy.where 针对 4 列创建标志
- java - 杰克逊多态性:基于条件反序列化
- python - 将 get_weights() 用于 xception 时的值错误
- javascript - 不能通过 removeEventlistener 使用事件:'e is undefined' (Firefox)
- templates - 干出我的 Makefile:当命令因单个可派生参数而异时,避免重复 Makefile 配方
- android - 即使视频停止后,Exoplayer 也会继续播放音频
- java - 如何在媒体播放时检测耳机是否断开连接