чтение xmlnode с помощью xmlDocment

#c# #xml #xmldocument

#c# #xml #xmldocument

Вопрос:

как я могу прочитать Id приведенный ниже пример XML >>> CatalogItem Id="3212" и OrganizationName

 string xmlfile = @"C:UserseaswaranpDesktoptest.xml";
            ArrayList arrResult = new ArrayList();
            string sContent = File.ReadAllText(xmlfile);
            StringReader DocumentReader = new StringReader(sContent);
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(DocumentReader);
            XmlNodeList ReferenceNodes = xmlDoc.GetElementsByTagName("content:Topic");

            foreach (XmlNode Node in ReferenceNodes)
            {                
              string sTopicName = Node.ParentNode.ParentNode.Attributes["OrganizationName"].Value;
            }

            foreach (string s in arrResult)
            {
                Console.WriteLine(s);
            }
            Console.Read();


<content type="application/xml">
    <CatalogItems xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="sitename.xsd">
        <CatalogSource Acronym="ABC" OrganizationName="ABC Corporation" />
        <CatalogItem Id="32122" CatalogUrl="urlname">
            <ContentItem xmlns:content="sitename.xsd" Title="Department 1">
                <content:SelectionSpec ClassList="" ElementList="" />
                <content:Language Value="eng" Scheme="ISO 639-2" />
                <content:Source Acronym="ABC" OrganizationName="ABC Corporation1" />
                <content:Topics Scheme="ABC">
                    <content:Topic TopicId="1" TopicName="Marketing1" />
                    <content:Topic TopicId="11" TopicName="Coverage1" />
                </content:Topics>
            </ContentItem>
        </CatalogItem>
    <CatalogItem Id="3212" CatalogUrl="urlname">
        <ContentItem xmlns:content="sitename.xsd" Title="Department 2">
            <content:SelectionSpec ClassList="" ElementList="" />
            <content:Language Value="eng" Scheme="ISO 639-2" />
            <content:Source Acronym="ABC" OrganizationName="ABC Corporation2" />
            <content:Topics Scheme="ABC">
                <content:Topic TopicId="2" TopicName="Marketing2" />
                <content:Topic TopicId="22" TopicName="Coverage2" />
            </content:Topics>
        </ContentItem>
    </CatalogItem>
    <CatalogItem Id="32132" CatalogUrl="urlname">
        <ContentItem xmlns:content="sitename.xsd" Title="Department 3">
            <content:SelectionSpec ClassList="" ElementList="" />
            <content:Language Value="eng" Scheme="ISO 639-2" />
            <content:Source Acronym="ABC" OrganizationName="ABC Corporation3" />
            <content:Topics Scheme="ABC">
                <content:Topic TopicId="3" TopicName="Marketing3" />
                <content:Topic TopicId="33" TopicName="Coverage3" />
            </content:Topics>
        </ContentItem>
    </CatalogItem>
    </CatalogItems>
</content>
  

Комментарии:

1. Вы ограничены в использовании XMLDocument или можете использовать XDocument ?

2. я открыт для использования любого API, если он работает с моей другой половиной кода … вот почему я сказал использовать xmldocument

Ответ №1:

 using System;
using System.IO;
using System.Xml;

class GetValue{
    public static void Main(){
        var xmlDoc = new XmlDocument();
        xmlDoc.Load("test.xml");

        var xmlRoot = xmlDoc.DocumentElement;
        var nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
        nsmgr.AddNamespace("content", "sitename.xsd");
        var attr = xmlRoot.SelectSingleNode("descendant::content:Source/@OrganizationName[../../../@Id='3212']", nsmgr);
        if(attr == null)
            Console.WriteLine("not found!");
        else
            Console.WriteLine(attr.Value);
    }
}
  

ВЫВОД:

ABC Corporation2

Ответ №2:

XPath — ваш друг, когда дело доходит до подобных задач. Я адаптировал следующий код из учебника по codeproject.com . Я не знаю, работает ли это (или даже будет компилироваться), но это должно помочь вам начать в правильном направлении. Кроме того, я предполагаю, что вы говорите о C #, но на случай, если я неправильно понял, какой язык вы используете, пожалуйста, не обращайте внимания (языковой тег в вашем вопросе может помочь).

 using System.Xml;
using System.Xml.XPath;
....
string fileName = "test.xml";
XPathDocument doc = new XPathDocument(fileName);
XPathNavigator nav = doc.CreateNavigator();

// Compile a standard XPath expression

XPathExpression expr; 
idExpr = nav.Compile("/content/CatalogItems/CatalogItem/@id");
XPathNodeIterator iterator = nav.Select(idExpr);

// Iterate on the node set

try
{
  while (iterator.MoveNext())
  {
     XPathNavigator nav2 = iterator.Current.Clone();
     Console.WriteLine("id: "   nav2.Value);
  }
}
catch(Exception ex) 
{
   Console.WriteLine(ex.Message);
}