Проблема обработки .NET XDocument - PullRequest
0 голосов
/ 28 августа 2018

У меня есть следующий XML, и я пытаюсь получить значение элемента "MarcEntryInfo", где оно равно 974, кто-нибудь знает, как это выражается с помощью XDocument.

В моем C # -коде я пытался получить значение, но, похоже, он не может получить значение.

Еще один способ выразить то, что я спрашиваю, - это если дочерние теги MarcEntryInfo имеют идентификатор записи определенного значения, возвращающий строковое значение текстового дочернего элемента этого конкретного MarcEntryInfo.

Спасибо

<LookupTitleInfoResponse xmlns="http://schemas.sirsidynix.com/symws/standard">
  <TitleInfo>
    <titleID>4971729</titleID>
    <CallInfo>
      <libraryID>PRODUCT</libraryID>
      <classificationID>ALPHANUM</classificationID>
      <callNumber>WS6689</callNumber>
      <numberOfCopies>1</numberOfCopies>
      <ItemInfo>
        <itemID>4971729-1001</itemID>
        <itemTypeID>TAPE</itemTypeID>
        <currentLocationID>STORE</currentLocationID>
        <homeLocationID>STORE</homeLocationID>
        <chargeable>true</chargeable>
        <fixedTimeBooking>false</fixedTimeBooking>
      </ItemInfo>
    </CallInfo>
    <BibliographicInfo>
      <MarcEntryInfo>
        <label>MD-ARK</label>
        <entryID>974</entryID>
        <indicators></indicators>
        <text>ark:/81055/vdc_100000006155.0x2afcee</text>
        <entryTypeCodes>L</entryTypeCodes>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>L-ARK: INGESTED</label>
        <entryID>975</entryID>
        <indicators></indicators>
        <text>ark:/81055/vdc_100055625567.0x000002</text>
        <entryTypeCodes>L</entryTypeCodes>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>SHELFMARK</label>
        <entryID>087</entryID>
        <indicators></indicators>
        <text>WS6689</text>
        <entryTypeCodes>VR</entryTypeCodes>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>Unpublished series</label>
        <entryID>441</entryID>
        <indicators></indicators>
        <text>Wildlife species reels</text>
        <entryTypeCodes>MTR</entryTypeCodes>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>Other ref. no.</label>
        <entryID>091</entryID>
        <indicators></indicators>
        <text>W Melanogrammus aeglefinus r1</text>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>Product title</label>
        <entryID>499</entryID>
        <indicators></indicators>
        <text>Melanogrammus aeglefinus r1</text>
        <entryTypeCodes>MAR</entryTypeCodes>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>Format</label>
        <entryID>310</entryID>
        <indicators></indicators>
        <text>1 tape reel</text>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>Cataloguing status</label>
        <entryID>971</entryID>
        <indicators></indicators>
        <text>prc</text>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>Data source</label>
        <entryID>976</entryID>
        <indicators></indicators>
        <text>WSF</text>
      </MarcEntryInfo>
      <MarcEntryInfo>
        <label>Content  code</label>
        <entryID>312</entryID>
        <indicators></indicators>
        <text>a</text>
        <entryTypeCodes>L</entryTypeCodes>
      </MarcEntryInfo>
    </BibliographicInfo>
  </TitleInfo>
</LookupTitleInfoResponse>

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Я думаю, что вы можете использовать Linq to XML здесь

код ниже позволит вам получить все теги Id записи в XML

если вам нужно конкретное значение, вы можете добавить .SingleOrDefault (el => el.Value == "974");

var xml = XElement.Load(YourDocumentPath);

var allEntryIds = xml.Elements()
    .SingleOrDefault(el=>el.Name.LocalName=="TitleInfo")
    .Elements()
        .SingleOrDefault(el => el.Name.LocalName == "BibliographicInfo")
        .Elements()
            .Where(el => el.Name.LocalName == "MarcEntryInfo")
            .Elements()
                .Where(el => el.Name.LocalName == "entryID");
0 голосов
/ 28 августа 2018

Я усек XML для краткости. Несколько вещей на заметку:

  • Вам нужно объявить пространство имен, чтобы найти ваш элемент
  • Вам нужно ссылаться на элементы по пространству имен в вашем выражении XPath
  • Вы должны выбрать элемент entryID, имеющий целевое значение, и перейти к его родительскому элементу

Пример кода приведен ниже. Получив элемент entryInfo, вы можете извлечь любую информацию из его дочерних элементов, которая вам нужна.

void Main()
{
    var xml = @"<LookupTitleInfoResponse xmlns=""http://schemas.sirsidynix.com/symws/standard"">
      <TitleInfo>
        <titleID>4971729</titleID>
        <CallInfo>
          <libraryID>PRODUCT</libraryID>
          <classificationID>ALPHANUM</classificationID>
          <callNumber>WS6689</callNumber>
          <numberOfCopies>1</numberOfCopies>
          <ItemInfo>
            <itemID>4971729-1001</itemID>
            <itemTypeID>TAPE</itemTypeID>
            <currentLocationID>STORE</currentLocationID>
            <homeLocationID>STORE</homeLocationID>
            <chargeable>true</chargeable>
            <fixedTimeBooking>false</fixedTimeBooking>
          </ItemInfo>
        </CallInfo>
        <BibliographicInfo>
          <MarcEntryInfo>
            <label>MD-ARK</label>
            <entryID>974</entryID>
            <indicators></indicators>
            <text>ark:/81055/vdc_100000006155.0x2afcee</text>
            <entryTypeCodes>L</entryTypeCodes>
          </MarcEntryInfo>
          <MarcEntryInfo>
            <label>Content  code</label>
            <entryID>312</entryID>
            <indicators></indicators>
            <text>a</text>
            <entryTypeCodes>L</entryTypeCodes>
          </MarcEntryInfo>
        </BibliographicInfo>
      </TitleInfo>
    </LookupTitleInfoResponse>";

    var nsManager = new XmlNamespaceManager(new NameTable());
    nsManager.AddNamespace("ns", "http://schemas.sirsidynix.com/symws/standard");

    var doc = XDocument.Parse(xml);
    var entryInfo = doc.XPathSelectElement("//ns:entryID[contains(text(), '974')]/..", nsManager);
    Console.WriteLine(entryInfo);

    // Output:
    // <MarcEntryInfo xmlns="http://schemas.sirsidynix.com/symws/standard">
    //   <label>MD-ARK</label>
    //   <entryID>974</entryID>
    //   <indicators></indicators>
    //   <text>ark:/81055/vdc_100000006155.0x2afcee</text>
    //   <entryTypeCodes>L</entryTypeCodes>
    // </MarcEntryInfo>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...