VB.net操作XML创建一个带前缀的节点的问题
如果使用下面的语句创建一个节点
Dim newNode As XmlNode = tempFile.CreateNode(XmlNodeType.Element,"TESTPrefix:TESTNODE", Nothing)
则创建出来的节点如下:
<TESTNODE /> 没有前缀
如果使用下面的语句创建一个节点
Dim newNode As XmlNode = tempFile.CreateNode(XmlNodeType.Element,"TESTPrefix:TESTNODE", "TESTPrefix")
则创建出来的节点如下:
<TESTPrefix:TESTNODE xmlns:TESTPrefix="TESTPrefix" />
前缀是有了 但是多出来这部分内容xmlns:TESTPrefix="TESTPrefix"且无法删掉。这部分多出来的内容并不属于Attribute
如果使用下面的语句创建一个节点
Dim newNode As XmlNode = tempFile.CreateNode(XmlNodeType.Element,"TESTPrefix","TESTNODE", null) 或
Dim newNode As XmlNode = tempFile.CreateNode(XmlNodeType.Element,"TESTPrefix","TESTNODE", null)
则创建出来的节点如下:
<TESTNODE /> 没有前缀
如果使用下面的语句创建一个节点
Dim newNode As XmlNode = tempFile.CreateNode(XmlNodeType.Element,"TESTPrefix","TESTNODE", "TESTPrefix")
则创建出来的节点如下:
<TESTPrefix:TESTNODE xmlns:TESTPrefix="TESTPrefix" />
前缀是有了 但是多出来这部分内容xmlns:TESTPrefix="TESTPrefix"且无法删掉。这部分多出来的内容并不属于Attribute
以上方法创建出来的节点的node.name 都为:TESTPrefix:TESTNODE 但就是xml上没有前缀。
求教 如何能创建一个这样的节点
<TESTPrefix:TESTNODE />
[解决办法]
你使用字符串格式,保存成xml名称的文本文件吧
TESTPrefix代表名称空间,需要xmlns的
[解决办法]
俺早些时候,设计的一个子程序,你参考下,可直接调用,或你参考着改吧。
'----调用示例 '---根据属性条件删除 ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions//Switch", "Num", "Type", "Type", "2") '满足属性Type="2"删除其下全部属性数据 ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions//Switch", "Num", "", "Type", "2") '满足属性Type="2"删除其下Num属性数据 ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions//Switch", "", "Type", "Type", "2") '满足属性Type="2"删除其下Type属性数据 ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions//Switch", "", "", "Type", "2") '满足属性Type="2"删除节点数据 '---根据属性条件删除 '---强删除 ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions//Switch", "Num", "Type", "", "") '删除其下全部属性数据 ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions//Switch", "Num", "", "", "") '删除其下Num属性数据 ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions//Switch", "", "Type", "", "") '删除其下Type属性数据 ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions//Switch", "", "", "", "") '删除节点数据 '--- ' Delete_Xml_Data(Xml_FileName, "Kjx_Config//Zb_Data_Solutions", "", "", "", "") '删除数据 '---强删除 '----调用示例 '------------ ' 子程序名 : 删除 XML 文件中的指定数据 ' 参数1 filename 带路径文件名 ' 参数2 xml_Nodes 带路径节点名 ,"Kjx_Config//Zb_Data_Solutions//Switch" ' 参数3 xml_Attribute1 节点的第1个属性名--处理的对象,删此属性用 ' 参数4 xml_Attribute2 节点的第2个属性名--处理的对象,删此属性用,参数3,4均为空时,则操作对象是删该节点 ' 参数5 Search_attribute 查找的属性名--删除需要的条件,参数5为空时,则属于强删除,不检查条件选项 ' 参数6 Attribute_Data 查找的属性数据内容 '------------ Sub Delete_Xml_Data(ByVal filename As String, ByVal xml_Nodes As String, ByVal xml_Attribute1 As String, _ ByVal xml_Attribute2 As String, ByVal Search_attribute As String, ByVal Attribute_Data As String) '后面两参数是属性条件 Try Dim xmlDoc As New XmlDocument() xmlDoc.Load(filename) ' Dim xnl As XmlNodeList = xmlDoc.SelectSingleNode(xml_Nodes).ChildNodes ---备用 Dim xnl As XmlNodeList = xmlDoc.SelectNodes(xml_Nodes) '目标是 xml_Nodes 节点下的所有对象 '---- If Search_attribute = "" Then '判定是否需要满足属性条件删除 If xml_Attribute1 = "" Then If xml_Attribute2 = "" Then ' 遍历 xml_Nodes 所有子节点或对象‘将其下面内容删除 For Each xn As XmlNode In xnl Dim xe As XmlElement = DirectCast(xn, XmlElement) xe.RemoveAll() '将 xml_Nodes 节点内容移除,保留默认目录 Next Else ' 遍历 xml_Nodes 所有子节点或对象‘将其下面内容删除 For Each xn As XmlNode In xnl Dim xe As XmlElement = DirectCast(xn, XmlElement) xe.RemoveAttribute(xml_Attribute2) '只删去 xml_Attribute2 的属性及值--选择性删除 Next End If Else If xml_Attribute2 = "" Then ' 遍历 xml_Nodes 所有子节点或对象‘将其下面内容删除 For Each xn As XmlNode In xnl Dim xe As XmlElement = DirectCast(xn, XmlElement) xe.RemoveAttribute(xml_Attribute1) '只删去 xml_Attribute1 的属性及值--选择性删除 Next Else ' 遍历 xml_Nodes 所有子节点或对象‘将其下面内容删除 For Each xn As XmlNode In xnl Dim xe As XmlElement = DirectCast(xn, XmlElement) xe.RemoveAllAttributes() '将其下所有 属性移除 Next End If End If '---- Else If xml_Attribute1 = "" Then If xml_Attribute2 = "" Then ' 遍历 xml_Nodes 所有子节点或对象‘将其下面内容删除 For Each xn As XmlNode In xnl Dim xe As XmlElement = DirectCast(xn, XmlElement) If xe.GetAttribute(Search_attribute) = Attribute_Data Then '根据属性条件删除 xe.RemoveAll() '将 xml_Nodes 节点内容移除,保留默认目录 End If Next Else ' 遍历 xml_Nodes 所有子节点或对象‘将其下面内容删除 For Each xn As XmlNode In xnl Dim xe As XmlElement = DirectCast(xn, XmlElement) If xe.GetAttribute(Search_attribute) = Attribute_Data Then '根据属性条件删除 xe.RemoveAttribute(xml_Attribute2) '只删去 xml_Attribute2 的属性及值--选择性删除 End If Next End If Else If xml_Attribute2 = "" Then ' 遍历 xml_Nodes 所有子节点或对象‘将其下面内容删除 For Each xn As XmlNode In xnl Dim xe As XmlElement = DirectCast(xn, XmlElement) If xe.GetAttribute(Search_attribute) = Attribute_Data Then '根据属性条件删除 xe.RemoveAttribute(xml_Attribute1) '只删去 xml_Attribute1 的属性及值--选择性删除 End If Next Else ' 遍历 xml_Nodes 所有子节点或对象‘将其下面内容删除 For Each xn As XmlNode In xnl Dim xe As XmlElement = DirectCast(xn, XmlElement) If xe.GetAttribute(Search_attribute) = Attribute_Data Then '根据属性条件删除 xe.RemoveAllAttributes() '将其下所有 属性移除 End If Next End If End If '---- End If '---- '---- xmlDoc.Save(filename) MessageBox.Show("数据已删除!") Catch 'ex As Exception End Try End Sub
[解决办法]
以下是相关XML文件内容,你对照着看。
<?xml version="1.0" encoding="utf-8" ?> - <Kjx_Config>- <XSQ_SerialPort Id="COM1" download="1" Company="华宇科技"> <BaudRate>38400</BaudRate> </XSQ_SerialPort>- <TX1_SerialPort Id="COM2"> <BaudRate>9600</BaudRate> <DataBits>8</DataBits> <Paritys>None</Paritys> <StopBits>One</StopBits> <HandShake>None</HandShake> </TX1_SerialPort>- <TX2_SerialPort Id="COM3"> <BaudRate>9600</BaudRate> <DataBits>8</DataBits> <Paritys>None</Paritys> <StopBits>One</StopBits> <HandShake>None</HandShake> </TX2_SerialPort>- <TX3_SerialPort Id="COM4"> <BaudRate>9600</BaudRate> <DataBits>8</DataBits> <Paritys>None</Paritys> <StopBits>One</StopBits> <HandShake>None</HandShake> </TX3_SerialPort>- <Tcp_Server Port="502" No_Command_Time="30"> <Connection_interval>0</Connection_interval> <Abnormal_times>5</Abnormal_times> <Delay_answer>0</Delay_answer> </Tcp_Server>- <Zb_Data_Solutions Number="32"> <Switch Num="1" Type="1" Tx="1">Mb_Hy1</Switch> <Switch Num="2" Type="1" Tx="2">Mb_Hy1</Switch> <Switch Num="3" Type="1" Tx="3">Mb_Hy1</Switch> <Switch Num="4" Type="1" Tx="1">Mb_Hy1</Switch> <Switch Num="5" Type="1" Tx="2">Mb_Hy1</Switch> <Switch Num="6" Type="1" Tx="3">Mb_Hy1</Switch> <Switch Num="7" Type="1" Tx="1">Mb_Hy1</Switch> <Switch Num="8" Type="1" Tx="2">Mb_Hy1</Switch> <Switch Num="9" Type="2" Tx="3">Mb_Hy2</Switch> <Switch Num="10" Type="2" Tx="1">Mb_Hy2</Switch> <Switch Num="11" Type="2" Tx="2">Mb_Hy2</Switch> <Switch Num="12" Type="2" Tx="3">Mb_Hy2</Switch> <Switch Num="13" Type="2" Tx="1">Mb_Hy2</Switch> <Switch Num="14" Type="2" Tx="2">Mb_Hy2</Switch> <Switch Num="15" Type="2" Tx="3">Mb_Hy2</Switch> <Switch Num="16" Type="2" Tx="1">Mb_Hy2</Switch> <Switch Num="17" Type="1" Tx="2">Mb_Hy1</Switch> <Switch Num="18" Type="1" Tx="3">Mb_Hy1</Switch> <Switch Num="19" Type="1" Tx="1">Mb_Hy1</Switch> <Switch Num="20" Type="1" Tx="2">Mb_Hy1</Switch> <Switch Num="21" Type="1" Tx="3">Mb_Hy1</Switch> <Switch Num="22" Type="1" Tx="1">Mb_Hy1</Switch> <Switch Num="23" Type="1" Tx="2">Mb_Hy1</Switch> <Switch Num="24" Type="1" Tx="3">Mb_Hy1</Switch> <Switch Num="25" Type="2" Tx="1">Mb_Hy2</Switch> <Switch Num="26" Type="2" Tx="2">Mb_Hy2</Switch> <Switch Num="27" Type="2" Tx="3">Mb_Hy2</Switch> <Switch Num="28" Type="2" Tx="1">Mb_Hy2</Switch> <Switch Num="29" Type="2" Tx="2">Mb_Hy2</Switch> <Switch Num="30" Type="2" Tx="3">Mb_Hy2</Switch> <Switch Num="31" Type="2" Tx="1">Mb_Hy2</Switch> <Switch Num="32" Type="2" Tx="2">Mb_Hy2</Switch> </Zb_Data_Solutions> <Pwd_Register Registration_code="EF2BBE3FDD6A5DD9C798E2BDF1D7759623EF64D7CA25F4ACE650B587732864B2" /> </Kjx_Config>