2015-05-19 60 views
0

我正在開發具有開放標記的XML文件,後面跟着一些帶有內部文本的子標記。當開始標籤再次出現時,它會這樣做,前一個沒有結束標籤。因此,例如,文件看起來是這樣的:通過xml循環以添加缺失標記

<?xml version="1.0" encoding="utf-8"?> 
<invoice> 
    <id>999</id> 
    <newRa elem="0"> 
     <createD>20150519</createD> 
     <modD>12345</modD> 
    </newRa> 
    <total>123.99</total> 
<invoice> 

我想創建一個使用XPath來的「發票」的每一次出現添加「/發票」標籤的動子。

應該是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<invoice> 
    <id>999</id> 
    <newRa elem="0"> 
     <createD>20150519</createD> 
     <modD>12345</modD> 
    </newRa> 
    <total>123.99</total> 
</invoice> 
<invoice> 
... 
... 

回答

1

如果該文件是足夠小,其全部被打開,你可以使用:

Dim st As String = My.Computer.FileSystem.ReadAllText("C:\temp\test.xml") 
st = st.Replace("</total>", "</total>" & vbCrLf & "</invoice>") 
My.Computer.FileSystem.WriteAllText("c:\temp\test.xml", st, False) 

如果文件較大,請創建StreamReader那讀取每一行並使用類似於上面st = st.Replace...行的行來在正確位置添加附加標籤,並將每行附加到新文件。

+0

我正在使用一個200MB的xml文件,所以它拋出了system.outofmemory異常。任何解決方法? – Gmac

+0

我沒有200 MB的xml文件來測試,所以我無法確定,但是您可能可以使用流讀取器來讀取每行並將其附加到新文件。當行內容等於「」時,您需要追加「」「&vbCrLf&」'https://msdn.microsoft.com/en-us/library/db5x7c0d%28v=vs.110%29 .aspx –

+0

是的,我實際上開始使用streamreader,但使用你的作品,它用相同的標籤替換結束標籤,添加一行,並添加發票關閉標籤。 – Gmac