Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在StreamReader循环中,有没有办法强制读取下一行?_Vb.net_While Loop_Streamreader - Fatal编程技术网

Vb.net 在StreamReader循环中,有没有办法强制读取下一行?

Vb.net 在StreamReader循环中,有没有办法强制读取下一行?,vb.net,while-loop,streamreader,Vb.net,While Loop,Streamreader,我正在处理一个txt文件,我想知道在我使用了streamreader当前读取的值之后,是否有办法强制它读取下一行 我的代码: Private Sub subTest() Dim sr As New StreamReader("d:\input\cleanedUp.txt") Dim doc As New XmlDocument Dim root As XmlElement = doc.CreateElement("Views") Dim ns As String

我正在处理一个txt文件,我想知道在我使用了streamreader当前读取的值之后,是否有办法强制它读取下一行

我的代码:

Private Sub subTest()
    Dim sr As New StreamReader("d:\input\cleanedUp.txt")
    Dim doc As New XmlDocument
    Dim root As XmlElement = doc.CreateElement("Views")
    Dim ns As String = sr.ReadLine()
    Dim nsAtt As XmlAttribute = doc.CreateAttribute("ClientCode")
    nsAtt.Value = ns
    root.Attributes.Append(nsAtt)

    While Not sr.EndOfStream
        Dim sLine As String = sr.ReadLine

        doc.AppendChild(root)
        Dim child As XmlElement = doc.CreateElement("View")
        root.AppendChild(child)
        Dim newAtt As XmlAttribute = doc.CreateAttribute("Name")
        newAtt.Value = sLine
        child.Attributes.Append(newAtt)

        Dim subChild As XmlElement = doc.CreateElement("Criteria")
        child.AppendChild(subChild)
        subChild.InnerText = sLine
    End While
    sr.Close() : sr.Dispose()

    Dim sett As New XmlWriterSettings
    sett.Indent = True

    Dim sw As XmlWriter = XmlWriter.Create("d:\input\data.xml", sett)
    doc.Save(sw)
    sw.Flush() : sw.Close()
End Sub
结果是:

<?xml version="1.0" encoding="utf-8"?>
<Views ClientCode="WSMCABS">
    <View Name="vACCESSONE">
        <Criteria>vACCESSONE</Criteria>
    </View>
    <View Name="ACCESSONE">
        <Criteria>ACCESSONE</Criteria>
    </View>
</Views>
    <?xml version="1.0" encoding="utf-8"?>
<Views ClientCode="WSMCABS">
    <View Name="vACCESSONE">
        <Criteria>ACCESSONE</Criteria>
    </View>
    <View Name="vSample2">
        <Criteria>SAMPLE2</Criteria>
    </View>
</Views>

真空塞松
存取器
我想要的是:

<?xml version="1.0" encoding="utf-8"?>
<Views ClientCode="WSMCABS">
    <View Name="vACCESSONE">
        <Criteria>vACCESSONE</Criteria>
    </View>
    <View Name="ACCESSONE">
        <Criteria>ACCESSONE</Criteria>
    </View>
</Views>
    <?xml version="1.0" encoding="utf-8"?>
<Views ClientCode="WSMCABS">
    <View Name="vACCESSONE">
        <Criteria>ACCESSONE</Criteria>
    </View>
    <View Name="vSample2">
        <Criteria>SAMPLE2</Criteria>
    </View>
</Views>

存取器
样本2

您可以测试循环中是否有另一行可用,并执行另一个ReadLine:

While Not sr.EndOfStream
    Dim sLine As String = sr.ReadLine
    DoSomethingWithLine(sLine)

    If Not sr.EndOfStream Then
        sLine = sr.ReadLine
        DoSomethingElseWithLine(sLine)
    End If
End While

所以我遇到的问题是,读者会为每一行读到的内容创建一个新的子/子孩子,相反,我想要一个有多个子孩子的孩子。所以这有点像黑客,但我通过设置一个循环来实现这一点,循环中的某些条件适用于我的情况。对于其他试图完成类似任务的人来说,这可能不是最好的答案,但它对我来说很有效,因为我的文本文件由SQL视图组成,这些视图以“v”开头,后跟特定视图的条件。然后,当程序看到行上读取了另一个视图(以“v”开头)时,它会停止添加额外的子孩子节点

While Not sr.EndOfStream

        doc.AppendChild(root)
        Dim child As XmlElement = doc.CreateElement("View")
        root.AppendChild(child)
        Dim newAtt As XmlAttribute = doc.CreateAttribute("Name")
        newAtt.Value = sLine
        child.Attributes.Append(newAtt)

        If sLine.StartsWith("v") Then
            sLine = sr.ReadLine
            While Not sLine.StartsWith("v")
                Dim subChild As XmlElement = doc.CreateElement("Criteria")
                child.AppendChild(subChild)
                subChild.InnerText = sLine
                sLine = sr.ReadLine
                If sLine = Nothing Then
                    sLine = sr.ReadLine
                End If
                If sLine = Nothing Then
                    Exit While
                End If
            End While
        End If

    End While
    sr.Close() : sr.Dispose()

我同意@SLaks,为什么不调用streamreader的ReadLine()函数呢?您介意发布一个代码示例吗?发布用作输入的cleanup.txt。同上,调用readline()-每次调用占用一行。注意,在进入While循环之前,您的代码占用了DIM ns中的一行。使用您的流逻辑移动模糊sLine。。。如果Dim ns为,则在While循环的底部,使用sLine=Readline()加载下一行。