2016-11-24 5 views
0

は私のXMLスニペットで属性:XML読む次の問題

<root> 
    <EmployeeSearcher_CMSRequest xmlns="http://schemas.datacontract.org/2004/07/xxxx" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <IsActive>A</IsActive> 
    <DepartmentCode>4775</DepartmentCode> 
    <OfficeCode>KA016</OfficeCode> 
    <EmployeeFirstName>James</EmployeeFirstName> 
    <EmployeeId>0043044</EmployeeId> 
    <EmployeeLastName>Malarkey</EmployeeLastName> 
    </EmployeeSearcher_CMSRequest> 
</root> 

次のXMLデータを取得するためのコードです:

Public Function GetRequest(Of TRequest)(Optional ByVal fileName As String = Nothing) As TRequest() 
    Dim objCertificateCountRequest As List(Of TRequest) = New List(Of TRequest) 
    Dim serializer As DataContractSerializer = New DataContractSerializer(GetType(TRequest)) 

    'Get the assembly folder 
    Dim assemblyPath As String = New Uri(Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath 
    'Get the file name 
    If (IsNothing(fileName)) Then 
     fileName = Path.GetDirectoryName(assemblyPath) + testDataForlder + GetType(TRequest).Name + ".xml" 
    Else 
     fileName = Path.GetDirectoryName(assemblyPath) + testDataForlder + fileName + ".xml" 
    End If 

    Try 
     Dim settings As New XmlReaderSettings() 
     settings.IgnoreWhitespace = True 
     Dim reader As XmlReader = XmlReader.Create(fileName, settings) 

     reader.ReadStartElement("root") 

     While reader.IsStartElement(GetType(TRequest).Name) 

      objCertificateCountRequest.Add(CType(serializer.ReadObject(reader), TRequest)) 

     End While 

     reader.ReadEndElement() 'Read root 
     reader.Close() 

     Return objCertificateCountRequest.ToArray() 
    Catch ex As Exception 

     Throw New System.Exception("Error deserializing input xml for Request:" + GetType(TRequest).Name + vbLf + ex.Message) 

    End Try 

End Function 

XMLからデータを取り出すだけ第1の属性と<OfficeCode>が読み込まれている間。それ以外に値は読み取られません。何かお勧めします。

+0

を試してみてください(http://www.codeproject.com/Articles/292726/Serialization-Part-III-XML-Serialization)?コード内のデータの構造を改善します。 –

+0

'XmlReader'を使う特別な理由はありますか? LinqからXmlへの直観的な代替方法があります。 –

+0

VBを使用しているので、母国語をサポートしている[LINQ to XMLの使用を検討する](http://stackoverflow.com/a/10805100/87698)。 – Heinzi

答えて

0

名前空間が必要です。おそらく、[XMLをデシリアライズ]検討した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 request = doc.Descendants().Where(Function(x) x.Name.LocalName = "EmployeeSearcher_CMSRequest") 
     Dim ns As XNamespace = request.FirstOrDefault().GetDefaultNamespace 
     Dim employee = request.Select(Function(x) New With { _ 
      .isActive = x.Element(ns + "IsActive").Value, 
      .departmentCode = x.Element(ns + "DepartmentCode").Value, 
      .officeCode = x.Element(ns + "OfficeCode").Value, 
      .employeeFirstName = x.Element(ns + "EmployeeFirstName").Value, 
      .employeeId = x.Element(ns + "EmployeeId").Value, 
      .employeeLastName = x.Element(ns + "EmployeeLastName").Value 
     }).FirstOrDefault() 

    End Sub 

End Module 
+0

'Imports を先頭に追加すると、VBのネイティブLINQ-to-XML構文を使用することもできます。 '.isActive = x。 .Value'。 – Heinzi

+0

多くの方法があり、私はその特定の関数に対してその関数を書くことはできません。それは動的でなければならず、他のすべての32の奇妙な方法でそうしています。 –

+0

ランダムにデータを読み込むことはできず、結果を処理することはできません。あなたには何らかの組織が必要です。データの動的な読み込みはそれほど有用ではありません。 – jdweng