2016-01-09 56 views
0

我有一個每月更改的XML數據文件。Visual Basic,讀取XML多級別節點和公共屬性

它包含來自高端打印系統打印的作業的數據。我需要閱讀每個頁面的覆蓋率數據,我可以檢索作業名稱和大部分數據,但似乎無法確定如何爲每個頁面準備好個別覆蓋範圍(將其鏈接到特定頁面)?

示例文件:

<JOBS01_2016> 
    <JOB_01_06_2016_16_48_17> 
    <JOB> 
     <TICKETID>101</TICKETID> 
     <JOBNAME>A4 booklet and creep test file.pdf</JOBNAME> 
     <ERRORMESSAGE>Job processing was cancelled</ERRORMESSAGE> 
    </JOB> 
    </JOB_01_06_2016_16_48_17> 
    <JOB_01_09_2016_20_48_39> 
    <JOB> 
     <TICKETID>103</TICKETID> 
     <JOBNAME>BlackA45percol.pdf</JOBNAME> 
     <HEIGHT>6916</HEIGHT> 
     <WIDTH>9721</WIDTH> 
    </JOB> 
    <MEDIA> 
     <MEDIAHEIGHT>7016</MEDIAHEIGHT> 
     <MEDIAWIDTH>9921</MEDIAWIDTH> 
     <MEDIANAME>Intec Light</MEDIANAME> 
     <NUMBEROFPAGES>4</NUMBEROFPAGES> 
    </MEDIA> 
    <QUALITY> 
     <RESOLUTIONX>1200</RESOLUTIONX> 
     <RESOLUTIONY>600</RESOLUTIONY> 
     <COLORMODE>4</COLORMODE> 
     <COLORMODENAME>CMYK</COLORMODENAME> 
    </QUALITY> 
    <COVERAGE> 
     <PAGE> 
     <PAGENUMBER>1</PAGENUMBER> 
     <C>3483675</C> 
     <M>3483675</M> 
     <Y>3948165</Y> 
     <K>3483675</K> 
     </PAGE> 
     <PAGE> 
     <PAGENUMBER>2</PAGENUMBER> 
     <C>0</C> 
     <M>3483675</M> 
     <Y>3948165</Y> 
     <K>3483675</K> 
     </PAGE> 
     <PAGE> 
     <PAGENUMBER>3</PAGENUMBER> 
     <C>3483675</C> 
     <M>3483675</M> 
     <Y>464490</Y> 
     <K>3483675</K> 
     </PAGE> 
     <PAGE> 
     <PAGENUMBER>4</PAGENUMBER> 
     <C>3483675</C> 
     <M>3483675</M> 
     <Y>3948165</Y> 
     <K>0</K> 
     </PAGE> 
    </COVERAGE> 
    </JOB_01_09_2016_20_48_39> 
</JOBS01_2016> 

我已經寫代碼的作業名稱(父節點)帶來了什麼?

 Dim xml As New XmlDocument 
    xml.Load("Jobs_01_2016.xml") 

    ListBox1().Items.Clear() 

    For Each node As XmlNode In xml.DocumentElement.SelectNodes("*") 
     ListBox1.Items.Add(node.Name) 
    Next 

然後,用戶選擇作業名稱,並應該得到的作業名稱,作業高度,寬度,分辨率和頁數,以覆蓋每個頁面(鏈接到頁碼)一起。 這我似乎無法得到? 我無法弄清楚如何閱讀與選定作業相關的內容以及具體的頁碼?

Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) _ 
    Handles ListBox1.SelectedIndexChanged 
    Dim Fred As String 
    Dim sbReadXML As New StringBuilder 

    Fred = ListBox1.SelectedItem.ToString() 
    Dim xml As New XmlDocument 
    xml.Load("Jobs_01_2016.xml") 

    Dim Jobname As String 

    Jobname = xml.SelectSingleNode("/JOBS01_2016/" + Fred + "/JOB/JOBNAME").InnerText 
    sbReadXML.Append("Job Name: ") 
    sbReadXML.Append(Jobname) 
    sbReadXML.AppendLine() 

    Dim MediaHeight As Integer = Integer.Parse(xml.SelectSingleNode("/JOBS01_2016/" + Fred + "/MEDIA/MEDIAHEIGHT").InnerText) 
    sbReadXML.Append("Media Height: ") 
    sbReadXML.Append(MediaHeight) 
    sbReadXML.AppendLine() 
    Dim MediaWidth As Integer = Integer.Parse(xml.SelectSingleNode("/JOBS01_2016/" + Fred + "/MEDIA/MEDIAWIDTH").InnerText) 
    sbReadXML.Append("Media Width: ") 
    sbReadXML.Append(MediaWidth) 
    sbReadXML.AppendLine() 
    Dim Nopages As Integer = Integer.Parse(xml.SelectSingleNode("/JOBS01_2016/" + Fred + "/MEDIA/NUMBEROFPAGES").InnerText) 
    sbReadXML.Append("No of Pages: ") 
    sbReadXML.Append(Nopages) 
    sbReadXML.AppendLine() 
    Dim Printtime As String 
    Printtime = xml.SelectSingleNode("/JOBS01_2016/" + Fred + "/PRINT/PRINTTIME").InnerText 
    sbReadXML.Append("Print Time: ") 
    sbReadXML.Append(Printtime) 
    sbReadXML.AppendLine() 
    Dim Resolutionx As Integer = Integer.Parse(xml.SelectSingleNode("/JOBS01_2016/" + Fred + "/QUALITY/RESOLUTIONX").InnerText) 
    sbReadXML.Append("Horizontal Resolution: ") 
    sbReadXML.Append(Resolutionx) 
    sbReadXML.AppendLine() 
    Dim Resolutiony As Integer = Integer.Parse(xml.SelectSingleNode("/JOBS01_2016/" + Fred + "/QUALITY/RESOLUTIONY").InnerText) 
    sbReadXML.Append("Vertical Resolution: ") 
    sbReadXML.Append(Resolutiony) 
    sbReadXML.AppendLine() 

    sbReadXML.Append(": ") 

    txtContent.Text = sbReadXML.ToString 'Show Contents 
End Sub 

任何幫助,將不勝感激。

+0

首先,你可以指定/標籤,它的Visual Basic(VB.Net,VBScript中,VBA等)?其次,您希望通過重新安排數據來改變XML?請張貼您想要的結果。 – Parfait

+0

Visual Studio 2013 - Visual Basic - 我沒有嘗試(打算轉換數據)。這個要求是一個作業成本工具,RIP設備輸出這個XML,其中包含作業的打印作業名稱,各種數據,以及用於作業大小的像素,以及用於每個色彩平面的分辨率和像素。我需要創建一個小界面,讀取xml,顯示作業並允許用戶選擇每個作業,並因此顯示作業成本。 – Squashsparky

+0

爲此,我需要能夠隔離每個作業的覆蓋範圍,每個頁面獨特的顏色和每個着色劑。我似乎無法越過孩子節點。 – Squashsparky

回答

0

嘗試XML LINQ

Imports System.Xml 
 
Imports System.Xml.Linq 
 
Module Module1 
 

 
    Const FILENAME As String = "c:\temp\test.xml" 
 

 
    Sub Main() 
 
     Dim doc As XDocument = XDocument.Load(FILENAME) 
 

 
     Dim jobs = doc.Elements().Select(Function(s) New With { 
 
              .name = s.Name.LocalName, 
 
              .jobs = s.Elements().Select(Function(t) New With { 
 
                      .jobName = t.Name.LocalName, 
 
                      .job = New With { 
 
                       .ticketID = CType(t.Element("JOB").Element("TICKETID"), Integer), 
 
                       .jobname = CType(t.Element("JOB").Element("JOBNAME"), String), 
 
                       .height = CType(t.Element("JOB").Element("HEIGHT"), String), 
 
                       .width = CType(t.Element("JOB").Element("WIDTH"), String), 
 
                       .errorMsg = CType(t.Element("JOB").Element("ERRORMESSAGE"), String) 
 
                      }, 
 
                      .media = t.Elements().Where(Function(u) u.Name.LocalName = "MEDIA").Select(Function(v) New With { 
 
                       .height = CType(v.Element("MEDIAHEIGHT"), Integer), 
 
                       .width = CType(v.Element("MEDIAWIDTH"), Integer), 
 
                       .name = CType(v.Element("MEDIANAME"), String), 
 
                       .pages = CType(v.Element("NUMBEROFPAGES"), Integer) 
 
                      }).FirstOrDefault(), 
 
                      .quality = t.Elements().Where(Function(u) u.Name.LocalName = "QUALITY").Select(Function(v) New With { 
 
                       .x = CType(v.Element("RESOLUTIONX"), Integer), 
 
                       .y = CType(v.Element("RESOLUTIONY"), Integer), 
 
                       .mode = CType(v.Element("COLORMODE"), Integer), 
 
                       .name = CType(v.Element("COLORMODENAME"), String) 
 
                      }).FirstOrDefault(), 
 
                      .coverage = t.Elements().Where(Function(u) u.Name.LocalName = "COVERAGE").Select(Function(v) New With { 
 
                       .pages = v.Elements("PAGE").Select(Function(w) New With { 
 
                        .pageNumber = CType(w.Element("PAGENUMBER"), Integer), 
 
                        .c = CType(w.Element("C"), Integer), 
 
                        .m = CType(w.Element("M"), Integer), 
 
                        .y = CType(w.Element("Y"), Integer), 
 
                        .k = CType(w.Element("K"), Integer) 
 
                       }).ToList() 
 
                      }).FirstOrDefault() 
 
                     }).ToList() 
 
             }).FirstOrDefault() 
 

 
    End Sub 
 

 
End Module 
 
​

+0

謝謝jdweng,但這看起來是C +? VisualStudio2013,visual Basic的任何想法?或者它可能看起來像我必須學習C :-) – Squashsparky

+0

代碼是VB.Net。確保在代碼頂部添加兩個導入語句。充分測試。 C#和VB.NET使用相同的Net Library,代碼可以很容易地從一種語言翻譯到另一種語言。 – jdweng