2017-03-10 8 views
0

필자는 필자가 VB 2010의 System.XML 측면에 대해 더 많이 알아 봤습니다. 필드 친구들이 사용하는 장비로 생성 된 특정 XML 파일을 파싱 할 때, 태그 이름과 내부 텍스트를 추출합니다. 그게 실제로 문제는 아니지만 결과를 텍스트 상자에 약간 형식화 된 방식으로 표시하려면 각 하위 노드의 자손 수준을 결정해야합니다. 예를 들어, 아래의 XML 코드에서 :VB 2010 XML - 자손 수준을 결정하는 방법

<document> 
    <PointRecord ID="00000050" TimeStamp="2017-03-03T09:39:54"> 
     <Name>WF2510</Name> 
     <Code>EOC RECT 6/</Code> 
     <Method>StaticObservation</Method> 
     <Classification>Normal</Classification> 
     <Deleted>false</Deleted> 

     <ECEFDeltas> 
      <DeltaX> 
       <Value>-14179.040909261</Value> 
       <InTolerance>True</InTolerance> 
      </DeltaX> 
      <DeltaY> 
       <Value>-3572.6636230592</Value> 
       <InTolerance>True</InTolerance> 
      </DeltaY> 
      <DeltaZ> 
       <Value>-8319.8607607852</Value> 
       <InTolerance>False</InTolerance> 
      </DeltaZ> 
      </ECEFDeltas> 
    </PointRecord> 
</Document> 

나는 다음과 같이 중심이 아닌 XML에 대한보다 읽기 쉬운 형식으로 제시 노드 이름 및 내부 텍스트를 추출하고 싶습니다 :

Point Record ID: 00000050 Time Stamp: 2017-03-03 09:39:54 
    Name: WF2510 
    Code: EOC RECT 6 
    Method: StaticObservation 
    Classification: Normal 
    Deleted: False 
    ECFDeltas- 
    DeltaX: -14179.040909261 In Tolerance: Yes 
    DeltaY: -3572.6636230592 In Tolerance: Yes 
    DeltaZ: -8319.8607607852 In Tolerance: No 

내가 겪고있는 문제는 각 하위 노드의 하위 노드에서 이름과 값을 들여 쓰거나 두 개의 공백, 네 개의 공백을 넣을 때를 알기 위해 하위 수준의 각 노드에 포함 된 결과를 그룹화하는 방법을 아는 것입니다 등등. 나는 각 노드의 자손 수준을 나타내는 정수 값을 찾으려고 노력하지만 운이 없다.

누군가 도움을 줄 수 있습니까?

감사합니다.

+0

xml 문서는 사용 가능한 노드의 좋은 예입니까? 아니면 더 많거나 적은 노드 및 하위 수준이있을 수 있습니까? – djv

+0

파일에는 수백 개의 노드가 있지만 특정 속성을 가진 노드 만 선택하고 있습니다. 그러나 이러한 노드에는 여러 수준의 자손이 있으므로 자손 수준은 형제에서 형제까지 다양합니다. 나는 현재 접근하고있어 중첩 된 'for-each'루프가 가능한 한 많은 레벨까지 드릴 다운 할 수 있지만, 얼마나 멀리 드릴링하고 드릴링을 멈추는지를 아는 것은 어렵습니다. 즉, 중첩 할 정도. 관심을 가져 주셔서 감사합니다. 나는 이것을 올바르게 설명하기를 바랍니다. –

+0

xml을 읽으려면 어떤 기술을 사용하고 있는지 잘 모르겠습니다. 나는 많은 XML 문서를 사용하지만, 항상 표준 모델을 따른다. 내가 제공 한 모델을 기반으로 답변을 게시하겠습니다. 그것은 당신을 위해 효과가있을 수도 있고 안될 수도 있습니다 (하지만 당신의 요구에 따라 더 많은 모델을 생성 할 수 있습니다). 내 대답을 보라. – djv

답변

0

xml 스키마와 일치하는 vb.net 클래스가 있습니까? 그렇지 않은 경우이 게시물을 따라 https://stackoverflow.com/a/17315863/832052을 생성 할 수 있습니다. 이제

'''<remarks/> 
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True), _ 
System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=False)> _ 
Partial Public Class Document 

    Private pointRecordField() As DocumentPointRecord 

    '''<remarks/> 
    <System.Xml.Serialization.XmlElementAttribute("PointRecord")> _ 
    Public Property PointRecord() As DocumentPointRecord() 
     Get 
      Return Me.pointRecordField 
     End Get 
     Set(value As DocumentPointRecord()) 
      Me.pointRecordField = value 
     End Set 
    End Property 
End Class 

'''<remarks/> 
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)> _ 
Partial Public Class DocumentPointRecord 

    Private nameField As String 

    Private codeField As String 

    Private methodField As String 

    Private classificationField As String 

    Private deletedField As Boolean 

    Private eCEFDeltasField As DocumentPointRecordECEFDeltas 

    Private idField As Byte 

    Private timeStampField As Date 

    '''<remarks/> 
    Public Property Name() As String 
     Get 
      Return Me.nameField 
     End Get 
     Set(value As String) 
      Me.nameField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property Code() As String 
     Get 
      Return Me.codeField 
     End Get 
     Set(value As String) 
      Me.codeField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property Method() As String 
     Get 
      Return Me.methodField 
     End Get 
     Set(value As String) 
      Me.methodField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property Classification() As String 
     Get 
      Return Me.classificationField 
     End Get 
     Set(value As String) 
      Me.classificationField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property Deleted() As Boolean 
     Get 
      Return Me.deletedField 
     End Get 
     Set(value As Boolean) 
      Me.deletedField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property ECEFDeltas() As DocumentPointRecordECEFDeltas 
     Get 
      Return Me.eCEFDeltasField 
     End Get 
     Set(value As DocumentPointRecordECEFDeltas) 
      Me.eCEFDeltasField = value 
     End Set 
    End Property 

    '''<remarks/> 
    <System.Xml.Serialization.XmlAttributeAttribute()> _ 
    Public Property ID() As Byte 
     Get 
      Return Me.idField 
     End Get 
     Set(value As Byte) 
      Me.idField = value 
     End Set 
    End Property 

    '''<remarks/> 
    <System.Xml.Serialization.XmlAttributeAttribute()> _ 
    Public Property TimeStamp() As Date 
     Get 
      Return Me.timeStampField 
     End Get 
     Set(value As Date) 
      Me.timeStampField = value 
     End Set 
    End Property 
End Class 

'''<remarks/> 
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)> _ 
Partial Public Class DocumentPointRecordECEFDeltas 

    Private deltaXField As DocumentPointRecordECEFDeltasDeltaX 

    Private deltaYField As DocumentPointRecordECEFDeltasDeltaY 

    Private deltaZField As DocumentPointRecordECEFDeltasDeltaZ 

    '''<remarks/> 
    Public Property DeltaX() As DocumentPointRecordECEFDeltasDeltaX 
     Get 
      Return Me.deltaXField 
     End Get 
     Set(value As DocumentPointRecordECEFDeltasDeltaX) 
      Me.deltaXField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property DeltaY() As DocumentPointRecordECEFDeltasDeltaY 
     Get 
      Return Me.deltaYField 
     End Get 
     Set(value As DocumentPointRecordECEFDeltasDeltaY) 
      Me.deltaYField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property DeltaZ() As DocumentPointRecordECEFDeltasDeltaZ 
     Get 
      Return Me.deltaZField 
     End Get 
     Set(value As DocumentPointRecordECEFDeltasDeltaZ) 
      Me.deltaZField = value 
     End Set 
    End Property 
End Class 

'''<remarks/> 
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)> _ 
Partial Public Class DocumentPointRecordECEFDeltasDeltaX 

    Private valueField As Decimal 

    Private inToleranceField As String 

    '''<remarks/> 
    Public Property Value() As Decimal 
     Get 
      Return Me.valueField 
     End Get 
     Set(value As Decimal) 
      Me.valueField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property InTolerance() As String 
     Get 
      Return Me.inToleranceField 
     End Get 
     Set(value As String) 
      Me.inToleranceField = value 
     End Set 
    End Property 
End Class 

'''<remarks/> 
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)> _ 
Partial Public Class DocumentPointRecordECEFDeltasDeltaY 

    Private valueField As Decimal 

    Private inToleranceField As String 

    '''<remarks/> 
    Public Property Value() As Decimal 
     Get 
      Return Me.valueField 
     End Get 
     Set(value As Decimal) 
      Me.valueField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property InTolerance() As String 
     Get 
      Return Me.inToleranceField 
     End Get 
     Set(value As String) 
      Me.inToleranceField = value 
     End Set 
    End Property 
End Class 

'''<remarks/> 
<System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)> _ 
Partial Public Class DocumentPointRecordECEFDeltasDeltaZ 

    Private valueField As Decimal 

    Private inToleranceField As String 

    '''<remarks/> 
    Public Property Value() As Decimal 
     Get 
      Return Me.valueField 
     End Get 
     Set(value As Decimal) 
      Me.valueField = value 
     End Set 
    End Property 

    '''<remarks/> 
    Public Property InTolerance() As String 
     Get 
      Return Me.inToleranceField 
     End Get 
     Set(value As String) 
      Me.inToleranceField = value 
     End Set 
    End Property 
End Class 

당신이 vb.net에서 클래스를 가지고, 당신은 직렬화와 클래스의 인스턴스에 XML 문서를 역 직렬화 할 수 있습니다

클래스는 다음과 같아야합니다.

Imports System.Xml 
Imports System.Xml.Serialization 
Imports System.IO 

Sub Main() 

    Dim s = New XmlSerializer(GetType(Document)) 
    Dim d As Document 
    ' use your filename here 
    Using sr = New StreamReader("document.xml") 
     d = CType(s.Deserialize(sr), Document) 
    End Using 
    For Each pr In d.PointRecord 
     Console.WriteLine("Point Record ID: {0} Time Stamp: {1}", 
          pr.ID, pr.TimeStamp) 
     Console.WriteLine(" Name: {0}", 
          pr.Name) 
     Console.WriteLine(" Code: {0}", 
          pr.Code) 
     Console.WriteLine(" Method: {0}", 
          pr.Method) 
     Console.WriteLine(" Classication: {0}", 
          pr.Classification) 
     Console.WriteLine(" Deleted: {0}", 
          pr.Deleted) 
     Console.WriteLine(" ECFDeltas-") 
     Console.WriteLine(" DeltaX: {0:0.000000000} In Tolerance: {1}", 
          pr.ECEFDeltas.DeltaX.Value, pr.ECEFDeltas.DeltaX.InTolerance) 
     Console.WriteLine(" DeltaY: {0:0.000000000} In Tolerance: {1}", 
          pr.ECEFDeltas.DeltaY.Value, pr.ECEFDeltas.DeltaY.InTolerance) 
     Console.WriteLine(" DeltaZ: {0:0.000000000} In Tolerance: {1}", 
          pr.ECEFDeltas.DeltaZ.Value, pr.ECEFDeltas.DeltaZ.InTolerance) 
    Next 
    Console.ReadLine() 
End Sub 

난 당신이이 가정 PointRecord의 배열을 가진 모델을 생성하기 위해 다른 <PointRecord ID="00000050" TimeStamp="2017-03-03T09:39:54"> 노드를 추가했다. 테스트 할 때
<Document> 
    <PointRecord ID="00000050" TimeStamp="2017-03-03T09:39:54"> 
     <Name>WF2510</Name> 
     <Code>EOC RECT 6/</Code> 
     <Method>StaticObservation</Method> 
     <Classification>Normal</Classification> 
     <Deleted>false</Deleted> 

     <ECEFDeltas> 
      <DeltaX> 
       <Value>-14179.040909261</Value> 
       <InTolerance>True</InTolerance> 
      </DeltaX> 
      <DeltaY> 
       <Value>-3572.6636230592</Value> 
       <InTolerance>True</InTolerance> 
      </DeltaY> 
      <DeltaZ> 
       <Value>-8319.8607607852</Value> 
       <InTolerance>False</InTolerance> 
      </DeltaZ> 
      </ECEFDeltas> 
    </PointRecord> 
    <PointRecord ID="00000051" TimeStamp="2017-03-03T09:39:54"> 
     <Name>WF2510</Name> 
     <Code>EOC RECT 6/</Code> 
     <Method>StaticObservation</Method> 
     <Classification>Normal</Classification> 
     <Deleted>false</Deleted> 

     <ECEFDeltas> 
      <DeltaX> 
       <Value>-14179.040909261</Value> 
       <InTolerance>True</InTolerance> 
      </DeltaX> 
      <DeltaY> 
       <Value>-3572.6636230592</Value> 
       <InTolerance>True</InTolerance> 
      </DeltaY> 
      <DeltaZ> 
       <Value>-8319.8607607852</Value> 
       <InTolerance>False</InTolerance> 
      </DeltaZ> 
      </ECEFDeltas> 
    </PointRecord> 
</Document> 

내의 XML 문서는 두 PointRecords했다. 프로그램의 출력 :

Point Record ID: 50 Time Stamp: 3/3/2017 9:39:54 AM 
    Name: WF2510 
    Code: EOC RECT 6/ 
    Method: StaticObservation 
    Classication: Normal 
    Deleted: False 
    ECFDeltas- 
    DeltaX: -14179.040909261 In Tolerance: True 
    DeltaY: -3572.663623059 In Tolerance: True 
    DeltaZ: -8319.860760785 In Tolerance: False 
Point Record ID: 51 Time Stamp: 3/3/2017 9:39:54 AM 
    Name: WF2510 
    Code: EOC RECT 6/ 
    Method: StaticObservation 
    Classication: Normal 
    Deleted: False 
    ECFDeltas- 
    DeltaX: -14179.040909261 In Tolerance: True 
    DeltaY: -3572.663623059 In Tolerance: True 
    DeltaZ: -8319.860760785 In Tolerance: False 
+0

당신은 나를위한 새로운 개념 인 직렬화를 사용했습니다. 당신의 코드는 내가 원하는 것을 정확하게 수행하므로, 기술 모드를 면밀히 연구 할 것입니다. 무리 감사! –

+0

어 오. 문제가 될 수 있습니다. 이 웹 응용 프로그램이 아니라 Windows 응용 프로그램이라는 것을 언급하지 않았습니다. "문서"를 인식하지 못하기 때문에 오류가 발생합니다. –

+0

Mine은 Windows 콘솔 응용 프로그램입니다. "document"는 필자의 xml 파일의 이름입니다. 해결책에 내 코드와 함께 넣어서 빌드시 출력 디렉토리에 복사됩니다. "document.xml"을 xml 문서의 경로로 바꿔야합니다. – djv