проблема в чтении XML с использованием C# - PullRequest
0 голосов
/ 14 января 2020

У меня ниже XML формат:

Этот файл XML не имеет никакой информации о стиле, связанной с ним. Дерево документа показано ниже.

<d:query xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" m:type="Microsoft.Office.Server.Search.REST.SearchResult">
<d:ElapsedTime m:type="Edm.Int32">114</d:ElapsedTime>
<d:PrimaryQueryResult m:type="Microsoft.Office.Server.Search.REST.QueryResult">
<d:CustomResults m:type="Collection(Microsoft.Office.Server.Search.REST.CustomResult)"/>
<d:QueryId>777211db-56a9-4cb8-804d-7fd6bcd3aadd</d:QueryId>
<d:QueryRuleId m:type="Edm.Guid">00000000-0000-0000-0000-000000000000</d:QueryRuleId>
<d:RefinementResults m:null="true"/>
<d:RelevantResults m:type="Microsoft.Office.Server.Search.REST.RelevantResults">
<d:GroupTemplateId m:null="true"/>
<d:ItemTemplateId m:null="true"/>
<d:Properties m:type="Collection(SP.KeyValue)">
<d:element>
<d:Key>GenerationId</d:Key>
<d:Value>9223372036854775806</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
<d:element>
<d:Key>indexSystem</d:Key>
<d:Value/>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element>
<d:Key>ExecutionTimeMs</d:Key>
<d:Value>109</d:Value>
<d:ValueType>Edm.Int32</d:ValueType>
</d:element>
<d:element>
<d:Key>QueryModification</d:Key>
<d:Value>demoDoc -ContentClass=urn:content-class:SPSPeople</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element>
<d:Key>RenderTemplateId</d:Key>
<d:Value>
~sitecollection/_catalogs/masterpage/Display Templates/Search/Group_Default.js
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element>
<d:Key>StartRecord</d:Key>
<d:Value>0</d:Value>
<d:ValueType>Edm.Int32</d:ValueType>
</d:element>
<d:element>
<d:Key>IsLastBlockInSubstrate</d:Key>
<d:Value>true</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>IsFirstBlockInSubstrate</d:Key>
<d:Value>false</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>IsFirstPinnedResultBlock</d:Key>
<d:Value>false</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>IsLastPinnedResultBlock</d:Key>
<d:Value>false</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>IsFirstRankedResultBlock</d:Key>
<d:Value>true</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>IsLastRankedResultBlock</d:Key>
<d:Value>true</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>GeoLocationSource</d:Key>
<d:Value>NAM</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element>
<d:Key>MixedTableOrder</d:Key>
<d:Value>0</d:Value>
<d:ValueType>Edm.Int32</d:ValueType>
</d:element>
</d:Properties>
<d:ResultTitle m:null="true"/>
<d:ResultTitleUrl m:null="true"/>
<d:RowCount m:type="Edm.Int32">1</d:RowCount>
<d:Table m:type="SP.SimpleDataTable">
<d:Rows>
<d:element m:type="SP.SimpleDataRow">
<d:Cells>
<d:element m:type="SP.KeyValue">
<d:Key>Rank</d:Key>
<d:Value>28.7494258880615</d:Value>
<d:ValueType>Edm.Double</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>DocId</d:Key>
<d:Value>17625071135127</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>WorkId</d:Key>
<d:Value>17625071135127</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>Title</d:Key>
<d:Value>DemoDoc</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>Author</d:Key>
<d:Value>John</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>Size</d:Key>
<d:Value>16820</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>Path</d:Key>
<d:Value>
https://company.sharepoint.com/sites/MOCTeams/Dev/DemocompanyApps/DemoDoc.docx
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>Description</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>Write</d:Key>
<d:Value>2012-08-07T16:44:00.0000000Z</d:Value>
<d:ValueType>Edm.DateTime</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>LastModifiedTime</d:Key>
<d:Value>2012-08-07T16:44:00.0000000Z</d:Value>
<d:ValueType>Edm.DateTime</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>CollapsingStatus</d:Key>
<d:Value>0</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>HitHighlightedSummary</d:Key>
<d:Value/>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>HitHighlightedProperties</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>contentclass</d:Key>
<d:Value>STS_ListItem_DocumentLibrary</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>PictureThumbnailURL</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ServerRedirectedURL</d:Key>
<d:Value>
https://company.sharepoint.com/sites/MOCTeams/Dev/_layouts/15/Doc.aspx?sourcedoc=%7BD6D61B34-73D2-4B46-B34C-9CA1D7681545%7D&file=DemoDoc.docx&action=default&mobileredirect=true&DefaultItemOpen=1
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ServerRedirectedEmbedURL</d:Key>
<d:Value>
https://company.sharepoint.com/sites/MOCTeams/Dev/_layouts/15/Doc.aspx?sourcedoc={d6d61b34-73d2-4b46-b34c-9ca1d7681545}&action=interactivepreview
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ServerRedirectedPreviewURL</d:Key>
<d:Value>
https://company.sharepoint.com/sites/MOCTeams/Dev/_layouts/15/Doc.aspx?sourcedoc={d6d61b34-73d2-4b46-b34c-9ca1d7681545}&action=imagepreview
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>FileExtension</d:Key>
<d:Value>docx</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ContentTypeId</d:Key>
<d:Value>0x0101002EF4BA7F2C07354788AC1CDBF96B8C6E</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ParentLink</d:Key>
<d:Value>
https://company.sharepoint.com/sites/MOCTeams/Dev/DemocompanyApps/Forms/AllItems.aspx
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ViewsLifeTime</d:Key>
<d:Value>4</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ViewsRecent</d:Key>
<d:Value>4</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>SectionNames</d:Key>
<d:Value/>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>SectionIndexes</d:Key>
<d:Value/>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>SiteLogo</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>SiteDescription</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>deeplinks</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>importance</d:Key>
<d:Value>0</d:Value>
<d:ValueType>Edm.Int64</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>SiteName</d:Key>
<d:Value>https://company.sharepoint.com/sites/mocteams</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>IsDocument</d:Key>
<d:Value>true</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>FileType</d:Key>
<d:Value>docx</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>IsContainer</d:Key>
<d:Value>false</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>WebTemplate</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>SecondaryFileExtension</d:Key>
<d:Value>docx</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>docaclmeta</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>SPWebUrl</d:Key>
<d:Value>
https://company.sharepoint.com/sites/MOCTeams/Dev
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>UniqueId</d:Key>
<d:Value>{D6D61B34-73D2-4B46-B34C-9CA1D7681545}</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ProgId</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>LinkingUrl</d:Key>
<d:Value>
https://company.sharepoint.com/sites/MOCTeams/Dev/DemocompanyApps/DemoDoc.docx?d=wd6d61b3473d24b46b34c9ca1d7681545
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>SiteId</d:Key>
<d:Value>b1a40cd6-9335-4284-8b41-7d26574a8f56</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>WebId</d:Key>
<d:Value>e6213bf7-6f48-4e79-90d5-ccfee7bbdf08</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>OriginalPath</d:Key>
<d:Value>
https://company.sharepoint.com/sites/MOCTeams/Dev/DemocompanyApps/DemoDoc.docx
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ResultTypeIdList</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>ResultTypeId</d:Key>
<d:Value m:null="true"/>
<d:ValueType>Null</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>RenderTemplateId</d:Key>
<d:Value>
~sitecollection/_catalogs/masterpage/Display Templates/Search/Item_Default.js
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>PartitionId</d:Key>
<d:Value>1ab41d5a-8833-4af0-82be-e3c54d03997b</d:Value>
<d:ValueType>Edm.Guid</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>UrlZone</d:Key>
<d:Value>0</d:Value>
<d:ValueType>Edm.Int32</d:ValueType>
</d:element>
<d:element m:type="SP.KeyValue">
<d:Key>Culture</d:Key>
<d:Value>en-US</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
</d:Cells>
</d:element>
</d:Rows>
</d:Table>
<d:TotalRows m:type="Edm.Int32">1</d:TotalRows>
<d:TotalRowsIncludingDuplicates m:type="Edm.Int32">1</d:TotalRowsIncludingDuplicates>
</d:RelevantResults>
<d:SpecialTermResults m:null="true"/>
</d:PrimaryQueryResult>
<d:Properties m:type="Collection(SP.KeyValue)">
<d:element>
<d:Key>RowLimit</d:Key>
<d:Value>10</d:Value>
<d:ValueType>Edm.Int32</d:ValueType>
</d:element>
<d:element>
<d:Key>SourceId</d:Key>
<d:Value>8413cd39-2156-4e00-b54d-11efd9abdb89</d:Value>
<d:ValueType>Edm.Guid</d:ValueType>
</d:element>
<d:element>
<d:Key>CorrelationId</d:Key>
<d:Value>c8622b9f-40b3-9000-8539-ae6db2299a08</d:Value>
<d:ValueType>Edm.Guid</d:ValueType>
</d:element>
<d:element>
<d:Key>WasGroupRestricted</d:Key>
<d:Value>false</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>WordBreakerLanguage</d:Key>
<d:Value>en</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element>
<d:Key>IsPartialUpnDocIdMapping</d:Key>
<d:Value>false</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>EnableInterleaving</d:Key>
<d:Value>true</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>IsMissingUnifiedGroups</d:Key>
<d:Value>false</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>Constellation</d:Key>
<d:Value>i29EA6</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element>
<d:Key>MultiGeoSearchStatus</d:Key>
<d:Value>Full</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element>
<d:Key>IsPartial</d:Key>
<d:Value>false</d:Value>
<d:ValueType>Edm.Boolean</d:ValueType>
</d:element>
<d:element>
<d:Key>InternalRequestId</d:Key>
<d:Value>a10cf383-be13-4f36-8bf2-927fad3f759f</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
<d:element>
<d:Key>SerializedQuery</d:Key>
<d:Value>
<Query Culture="en-US" EnableStemming="True" EnablePhonetic="False" EnableNicknames="False" IgnoreAllNoiseQuery="True" SummaryLength="180" MaxSnippetLength="180" DesiredSnippetLength="90" KeywordInclusion="0" QueryText="demoDoc" QueryTemplate="" TrimDuplicates="True" Site="321cf1a7-64e8-42b4-bcb0-979df1f325ba" Web="906b0097-58fe-40f6-9d28-97bfdbff7e22" KeywordType="True" HiddenConstraints="" />
</d:Value>
<d:ValueType>Edm.String</d:ValueType>
</d:element>
</d:Properties>
<d:SecondaryQueryResults m:type="Collection(Microsoft.Office.Server.Search.REST.QueryResult)"/>
<d:SpellingSuggestion/>
<d:TriggeredRules m:type="Collection(Edm.Guid)"/>
</d:query>

В настоящее время я читаю его, используя следующий код:

            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(response);

            // cycle through each child node 
            foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
            {
                // first node is the url ... have to go to nexted loc node 
                foreach (XmlNode locNode in node)
                {
                    // thereare a couple child nodes here so only take data from node named loc 
                    if (locNode.Name == "Path")
                    {
                        // get the content of the loc node 
                        string loc = locNode.InnerText;

                        // write it to the console so you can see its working 
                        Console.WriteLine(loc + Environment.NewLine);

                        // write it to the file 

                    }
                }
            }

Где я получаю данные xml в переменной ответа (которая извлекается ранее с использованием запроса Http). Но я не получаю никаких данных в xDo c, и поток кода выходит из точки xDoc.Load(response);.

Пример использования: значение выборки DocId из XML.

Пожалуйста, помогите, поскольку я новичок в C#.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Вам необходимо учитывать пространства имен, указанные в узле root.

        XmlDocument myXml= new XmlDocument();
        XmlNamespaceManager ns = new XmlNamespaceManager(myXml.NameTable);

        myXml.Load(xmlPath);

        // ================Namespaces======================
        ns.AddNamespace("a", "http://www.w3.org/TR/html4/");
        ns.AddNamespace("b", "http://www.w3.org/TR/html4/");
        // ================================================

Затем, когда вы пытаетесь получить данные из узла,

foreach (XmlNode node in myXml.SelectNodes($"//a:Table/a:Rows", ns))
                { //Do stuff}

Пожалуйста, дайте Я знаю, если вам нужно более глубокое объяснение.

0 голосов
/ 14 января 2020

Существует проблема с XML Схема должна быть определена.

<?xml version="1.0" encoding="utf-8" ?>
<d:Table xmlns:d="http://www.w3.org/TR/html4/" xmlns:m="http://www.w3.org/TR/html4/" m:type="SP.SimpleDataTable">
  <d:Rows>
    <d:element m:type="SP.SimpleDataRow">
      <d:Cells>
        <d:element m:type="SP.KeyValue">
          <d:Key>Rank</d:Key>
          <d:Value>28.7494258880615</d:Value>
          <d:ValueType>Edm.Double</d:ValueType>
        </d:element>
        <d:element m:type="SP.KeyValue">
          <d:Key>DocId</d:Key>
          <d:Value>17625071135127</d:Value>
          <d:ValueType>Edm.Int64</d:ValueType>
        </d:element>

      </d:Cells>
    </d:element>
  </d:Rows>
</d:Table>

Код CS

            XmlDocument xDoc = new XmlDocument();
            xDoc.Load("XMLFile1.xml");
            //xDoc.Load(response);

            // cycle through each child node 
            foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
            {
                // first node is the url ... have to go to nexted loc node 
                foreach (XmlNode locNode in node)
                {
                    // thereare a couple child nodes here so only take data from node named loc 
                    var nodeList = locNode.ChildNodes;
                    for (int i = 0; i < nodeList.Count; i++)
                    {
                        var childNodes = nodeList[i].ChildNodes;
                        for (int j = 0; j < childNodes.Count; j++)
                        {
                            Console.WriteLine($"DocId: "+childNodes[j].ChildNodes[1].InnerText + Environment.NewLine);
                            //childNodes[j].ChildNodes.AsQueryable()
                            //childNodes[i]
                        }
                    }

                }
            }

            Console.ReadKey();
...