【问题标题】:XML output is Duplicating Records VB.NETXML 输出是复制记录 VB.NET
【发布时间】:2020-05-13 22:20:04
【问题描述】:

我是新编程人员,如果您的回复简单且使用相同的语言,我将不胜感激。我正在处理更改我的 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>

感谢您的帮助。

【问题讨论】:

  • 在发布问题之前,请先查看预览。您的 xml 文件一团糟。您可以使用编辑器菜单功能区上标记为 { } 的按钮来格式化代码。只需选择每个部分并单击按钮。
  • 感谢玛丽编辑它。下次我发布问题时,我一定会按照您的指示进行操作,我尝试引用这些引号,但似乎没有用。
  • 不是引号,是大括号{}。

标签: xml vb.net dataset xmlwriter


【解决方案1】:

您的代码简化为几行代码

Module Module1
    Const FILENAME = "c:\temp\test.xml"
    Sub Main()
        Dim ds As New DataSet()
        ds.ReadXml(FILENAME)
    End Sub

End Module

【讨论】:

  • 您好,感谢您的回答。每次按下保存按钮时,如何使用该模块部分从我的 cad 软件中读取特定记录(“前缀”)? .不幸的是,此时我的编程技能非常有限,所以如果您能给我更详细的答案,我将不胜感激。
  • Dim prefixes() = ds.Tables(0).AsEnumerable().Select(Function(x) x.Field(Of String)("Prefix")).ToArray()
  • 酷,通过那行我可以显示我选择的值,我设法使它工作。我怎样才能替换那个特定的值?示例目前我有 92,我希望在将文件保存为 93 后使用它。它会解决我的重复文件问题吗?
  • ds.Tables[0].RowsAdd(new object() { "1", "61-02", "5", "0", "New Row"})
  • 谢谢队友,它会添加一个新行,我不想添加一个新行,我需要更新该行。该 xml 充当计数器和存储。所以它读取当前值,然后存储新值。同时,它可以使用当前前缀填充列表框。所以我为前缀 61-02 保存了 X 数量的组件或零件和 Y 数量的 Y 图纸。我以前使用 txt 文件来读取前缀、生成数字并替换它们,它的工作方式非常棒,而且速度非常快。但是我没有能力以与此数据集和 xml 相同的方式管理简单数据。
【解决方案2】:

绝对正确,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)`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多