在vb.net中并使用XML文档,我如何用值替换某些字符串,而不管它在哪个节点?

时间:2016-01-26 21:32:23

标签: xml vb.net

在vb.net中并使用XML文档,如何用值替换某些字符串 - 无论它在哪个节点 - 然后再写入xml文件? 我不想硬编码节点名称,因为我不知道将来节点名称是否会改变。

我有一个包含%%的不同变量的xml文件。我需要找到它们并根据它们改变它们的价值。

变量是: %IP% %掩码比特% %网关% %氯化钠% %主机名% %密码% %TZ% %键% %服务器% %MAC-窗口%

我开始的VB代码是:

    Imports System.Xml

    Dim xmlNode1 As XmlNode
    Dim strIp As String
    Dim strIPNewValue As String = "1.1.1.1"
    Dim bSuccess As Boolean = False

    Dim myXmlDocument As XmlDocument = New XmlDocument()

    myXmlDocument.Load("unattend.xml")

    xmlNode1 = myXmlDocument.DocumentElement

    ' Fields to match.
    strIp = "%ip%"

    ' Just do one pass threw and change the variables. 
    ' I don't want to hard code node names as I don't know if the node names
    ' will change in the future.

    ' Not sure how to proceed...


    If bSuccess = True Then
        myXmlDocument.Save("unattend.xml")
        Console.WriteLine("The XML file was saved successfully.")
    Else
        Console.WriteLine("The entry was not found.")
    End If

unattend.xml XML文件:

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
<settings pass="windowsPE">
    <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
        <SetupUILanguage>
            <UILanguage>en-US</UILanguage>
        </SetupUILanguage>
        <InputLocale>en-US</InputLocale>
        <SystemLocale>en-US</SystemLocale>
        <UILanguage>en-US</UILanguage>
        <UILanguageFallback>en-US</UILanguageFallback>
        <UserLocale>en-US</UserLocale>
    </component>
    <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
        <DiskConfiguration>
            <Disk wcm:action="add">
                <CreatePartitions>
                    <CreatePartition wcm:action="add">
                        <Order>1</Order>
                        <Size>350</Size>
                        <Type>Primary</Type>
                    </CreatePartition>
                    <CreatePartition wcm:action="add">
                        <Extend>true</Extend>
                        <Order>2</Order>
                        <Type>Primary</Type>
                    </CreatePartition>
                </CreatePartitions>
                <ModifyPartitions>
                    <ModifyPartition wcm:action="add">
                        <Active>true</Active>
                        <Format>NTFS</Format>
                        <Label>Boot</Label>
                        <Order>1</Order>
                        <PartitionID>1</PartitionID>
                    </ModifyPartition>
                    <ModifyPartition wcm:action="add">
                        <Format>NTFS</Format>
                        <Label>System</Label>
                        <Order>2</Order>
                        <PartitionID>2</PartitionID>
                    </ModifyPartition>
                </ModifyPartitions>
                <DiskID>0</DiskID>
                <WillWipeDisk>true</WillWipeDisk>
            </Disk>
        </DiskConfiguration>
        <ImageInstall>
            <OSImage>
                <InstallFrom>
                    <MetaData wcm:action="add">
                        <Key>/IMAGE/NAME</Key>
                        <Value>Windows Server 2012 R2 SERVERSTANDARD</Value>
                    </MetaData>
                </InstallFrom>
                <InstallTo>
                    <DiskID>0</DiskID>
                    <PartitionID>2</PartitionID>
                </InstallTo>
            </OSImage>
        </ImageInstall>
        <UserData>
            <ProductKey>
                <Key>%key%</Key>
                <WillShowUI>Never</WillShowUI>
            </ProductKey>
            <AcceptEula>true</AcceptEula>
            <FullName>Administrator</FullName>
            <Organization> </Organization>
        </UserData>
    </component>
</settings>
<settings pass="specialize">
    <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
        <OEMInformation>
            <HelpCustomized>false</HelpCustomized>
        </OEMInformation>
        <ComputerName>%hostname%</ComputerName>
        <TimeZone>%tz%</TimeZone>
        <RegisteredOwner/>
    </component>
    <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-Security-SPP-UX" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
        <SkipAutoActivation>true</SkipAutoActivation>
    </component>
    <component name="Microsoft-Windows-TCPIP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Interfaces>
            <Interface wcm:action="add">
                <Identifier>%mac-windows%</Identifier> 
                <Ipv4Settings>
                    <DhcpEnabled>false</DhcpEnabled> 
                    <Metric>20</Metric> 
                    <RouterDiscoveryEnabled>false</RouterDiscoveryEnabled> 
                </Ipv4Settings>
                <UnicastIpAddresses>
                    <IpAddress wcm:action="add" wcm:keyValue="1">%ip%/%netmask-bits%</IpAddress> 
                </UnicastIpAddresses>
                <Routes>
                    <Route wcm:action="add">
                        <Identifier>0</Identifier> 
                        <Prefix>0.0.0.0/0</Prefix> 
                        <Metric>20</Metric> 
                        <NextHopAddress>%gateway%</NextHopAddress> 
                    </Route>
                </Routes>
                <DNSServerSearchOrder>
                </DNSServerSearchOrder>
            </Interface>
        </Interfaces>
    </component>
    <component name="Microsoft-Windows-DNS-Client" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Interfaces>
            <Interface wcm:action="add">
                <Identifier>%mac-windows%</Identifier>
                <DNSServerSearchOrder>
                    <IpAddress wcm:action="add" wcm:keyValue="1">%ns%</IpAddress>
                </DNSServerSearchOrder>
            </Interface>
        </Interfaces>
    </component>
    <component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <RunSynchronous>
            <RunSynchronousCommand wcm:action="add">
                <Order>1</Order>
                <Path>cmd.exe /c powershell Invoke-WebRequest "http://%server%/installation-finished"</Path>
                <Description>Post-installation notification</Description>
            </RunSynchronousCommand>
        </RunSynchronous>
    </component>
</settings>
<settings pass="oobeSystem">
    <component xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
        <OOBE>
            <HideEULAPage>true</HideEULAPage>
            <HideLocalAccountScreen>true</HideLocalAccountScreen>
            <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
            <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
            <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
            <NetworkLocation>Home</NetworkLocation>
            <ProtectYourPC>1</ProtectYourPC>
        </OOBE>
        <UserAccounts>
            <AdministratorPassword>
                <Value>%password%</Value>
                <PlainText>true</PlainText>
            </AdministratorPassword>
        </UserAccounts>
        <RegisteredOwner/>
    </component>
</settings>
<settings pass="offlineServicing">
     <component     xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="Microsoft-Windows-   LUA-Settings" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35"    language="neutral" versionScope="nonSxS">
        <EnableLUA>false</EnableLUA>
       </component>
   </settings>
  </unattend>

2 个答案:

答案 0 :(得分:1)

由于文件不是很大,我可能只是把它读成一个字符串变量(使用System.IO.File.ReadAllText),然后为每个关键字运行String.Replace方法。

答案 1 :(得分:0)

    Imports System.Xml
    Module Module1
    Sub Main()
    Dim DocumentFileLocation As String = "your xml document location"
    Dim DocumentString As String = IO.File.ReadAllText(DocumentFileLocation)
    Dim Document = XmlReader.Create(DocumentString) 'do whatever you want in the xml
    ReplaceContentAndSave(DocumentString.Replace(char1, char2), DocumentFileLocation)
    'Your Document Reading Loop
    Do While Document.Read
    'do something
    Loop
    End Sub
    
    Sub ReplaceContentAndSave(newContent As String, path As String)
    My.Computer.FileSystem.WriteAllText(path, newContent, False)
    End Sub
    
    End Module

如果它不起作用那是因为我没有测试它