2013-06-25 4 views
0

Я исправил свою проблему при чтении XML-файлов. Теперь мне нужно урезать дату и время до MM dd yyyy hh: mm: ss и не доводить его до конца, когда я вставляю в свою базу данных Informix.Локализовать узлы в файле XML

Это информация XML:

<RecordFilingRequestMessage xmlns:nc="http://niem.gov/niem/niem-core/2.0"> 
<nc:DocumentIdentification> 
    <nc:IdentificationID>3212842</nc:IdentificationID> 
</nc:DocumentIdentification> 
<nc:DocumentPostDate> 
    <nc:DateTime>2013-06-25T11:32:08.5343733-04:00</nc:DateTime> 
</nc:DocumentPostDate> 
<nc:DocumentSubmitter> 
    <ecf:EntityPerson s:id="REVIEWER"> 
    <nc:PersonName /> 
    <nc:PersonOtherIdentification> 
     <nc:IdentificationID>41130</nc:IdentificationID> 
     <nc:IdentificationCategoryText>FLEPORTAL</nc:IdentificationCategoryText> 
    </nc:PersonOtherIdentification> 
    <nc:PersonOtherIdentification> 
     <nc:IdentificationID>kacolburn</nc:IdentificationID> 
     <nc:IdentificationCategoryText>FLEPORTAL_LOGONNAME</nc:IdentificationCategoryText> 
    </nc:PersonOtherIdentification> 

... и вот мой C# код:

string DocID = null; 
     int elementCount = 0; 
     string reqID = null; 
     string reqDateTime = null; 
     string empName = null; 
     string[] fileEntries = Directory.GetFiles(@"C:\XML\3212842.xml"); 
     foreach (string fileName in fileEntries) 
     { 
      XmlReader xr = XmlReader.Create(fileName); //reads XML from folder 
      while (xr.Read()) 
      { 
       if (xr.NodeType == XmlNodeType.Element && xr.Name == "nc:DateTime") 
       { 
        reqDateTime = xr.ReadElementContentAsString();     
       } 
       if (xr.NodeType == XmlNodeType.Element && xr.Name == "nc:IdentificationID") 
       { 
        elementCount++; 
        DocID = xr.ReadElementContentAsString(); 
        if (elementCount == 1) 
        { 
         reqID = DocID; 
        } 
        if (elementCount == 3) 
        { 
         empName = DocID; 
         listBox1.Items.Add(reqID + "/" + reqDateTime + "/" + empName); 
         elementCount = 0; 
         break; 
        } 
+0

'SelectNodes' принимает запрос XPath. Здесь есть две возможные проблемы: вы не включаете пространства имен XML для элементов, и вы также не передаете то, что похоже на действительный XPath. – GalacticCowboy

ответ

0

Моя первая мысль, что последняя «/» не принадлежит к вызову "SelectNodes.

Кроме того, этот код будет решить вашу проблему:

foreach(XmlNode node in xmlDoc.GetElementsByTagName("RecordFilingRequest")[0].GetElementsByTagName("nc:DocumentIdentification")) 
{ 
    int ID = Convert.ToInt32(node.FirstChild().InnerText); 
} 

Edit: Это предположить, что 'RecordFilingRequest' всегда существует. Добавьте инструкцию try .. catch, если это не так.

+0

Второе «GetElementsByTagName» не понравилось в VS 2010. Почему это должно быть? –

+0

Я пропустил что-то простое здесь? FirstChild или SelectSingleNode не принимаются, и я все еще нажимаю на ошибку во втором GetElementsByTagName. Я ценю вашу помощь до сих пор. XML настолько сложный –

0

Похоже, проблема в том, что XML использует пространство имен, и ваш XPath не , Вы не опубликовали свой полный XML, но у вас, вероятно, есть что-то вроде xmlns:nc="http://some.url/. Убедитесь в том, чтобы включать в себя пространство имен в менеджере пространства имен, а затем добавить префиксы пространств имен для запроса:

var nameTable = new NameTable(); 
var nsMgr = new XmlNamespaceManager(nameTable); 
nsmgr.AddNamespace("nc", "http://some.url/"); 

var dataNodes = xmlDoc.SelectNodes("nc:RecordFilingRequest/nc:DocumentIdentification", nsMgr); 
foreach (var node in dataNodes) 
{ 
    var ID = Convert.ToInt32(node.SelectSingleNode("nc:IdentificationID", nsMgr).InnerText); 
    // insert into database, e.g. using SqlCommand or whatever 
} 
Смежные вопросы