2015-09-21 3 views
3

У меня есть документ XML с настройкой похожа на это:Перебор всех узлов в XML-файл с C#

<invoice> 
    <IssueDate>2015-09-07</IssueDate> 
    <InvoiceType>380<InvoiceType> 
    <AccountingSupplierParty> 
     <Party> 
      <EndpointID></EndpointID> 
      <PartyName> 
        <Name>Company test</Name> 
      </PartyName> 
     </Party> 
    </AccountingSupplierParty> 
</invoice> 

Это лишь маленький кусочек всего XML-документ, просто чтобы показать, как выглядит файл.

Я хотел бы проверить, что все элементы также видят, имеют ли они пустые значения, такие как EndpointID в этом примере (мне нужно заменить пустые значения на NA).

Это то, что я до сих пор:

public static void AddToEmptyElements() 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load("testXml.xml"); 
    XmlNodeList nodes = xmlDoc.DocumentElement.ChildNodes; 
    foreach (XmlNode node in nodes) 
    { 
     Console.WriteLine(node.Name);    
    } 
} 

Однако, этот код будет только перебрать Чайлдс корневого узла и не все внук (или больших внук), такие как <Party> и <EndpointID> элементов , Как включить эти элементы в цикл?

+1

Да, конечно, используйте рекурсию. –

+0

проверьте это http://stackoverflow.com/questions/2915294/iterating-through-all-nodes-in-xml-file – Gaby

+2

Как примечание, LINQ to XML обычно делает жизнь намного проще. Ваша проблема определенно разрешима с помощью 'XmlDocument', но если вы можете использовать LINQ to XML, это будет однострочный ... –

ответ

2

Я не в среде для проверки кода прямо сейчас, но не возможно ли написать рекурсивный метод для дальнейшего прокрутки по узлам?

Что-то вроде этого (непроверенных код):

private static void handleNode(XmlNode node) 
{ 
    if(node.HasChildNodes) 
    { 
    foreach(XmlNode child in node.ChildNodes) 
    { 
     handleNode(child); 
    } 
    } 
    else 
    Console.WriteLine(node.Name); 
} 

затем вызвать этот метод в месте вашего Console.WrintLine()

2

Как Джон Скит уже сказал, вы могли бы сделать это с помощью LINQ к XML ,

XDocument xml = XDocument.Load(path); 
var emptyElements = xml.Descendants().Where(xe => String.IsNullOrEmpty(xe.Value)); 
foreach (var xe in emptyElements) 
    xe.Value = "NA";