Как извлечь родительское значение из XML, когда у дочернего элемента есть определенный текст - PullRequest
0 голосов
/ 29 января 2019

Я публикую на API, который возвращает XML, показывающий статус заказов, которые я разместил.На данный момент, чтобы получить код предупреждения и предупреждающее сообщение, это то, что я сделал, и он работает

Private Shared Function GetXMLElementValue(xml As String, element As String) As String
    Try
        Dim xDoc As XDocument = XDocument.Parse(xml)
        Dim node = xDoc.Descendants().Where(Function(n) n.Name = element).FirstOrDefault()
        Dim nodeValue As String = ""
        If node IsNot Nothing Then
            nodeValue = node.Value
        End If
        Return nodeValue
    Catch ex As Exception
        Return Nothing
    End Try
End Function

Я называю вышеуказанный метод примерно так:

Dim warningCode = GetXMLElementValue(responseReceivedFromApi, "warningCode")
Dim warningMessage = GetXMLElementValue(responseReceivedFromApi, "warningMessage")

Выше работает нормально, когда толькобыло опубликовано несколько заказов, однако сейчас я отправляю 300 заказов, и трудно найти, в каком порядке выдается предупреждение.

например, XML Returned

<order>
  <orderReference>148933</orderReference>
  <status>Updated</status>
</order>
<order>
  <orderReference>148955</orderReference>
  <status>Updated</status>
</order>
<order>
  <orderReference>148956</orderReference>
  <status>Updated</status>
  <warnings>
    <warning>
      <warningCode>1116</warningCode>
      <warningMessage><![CDATA["Address is inaccurate"]]></warningMessage>
    </warning>
  </warnings>
</order>
<order>
  <orderReference>149025</orderReference>
  <status>Updated</status>
</order>
<order>
  <orderReference>149034</orderReference>
  <status>Updated</status>
</order>

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

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Как насчет получения необходимой информации за один раз, а не за несколько звонков.Вдоль этих строк:

Dim orders As XElement = <orders>
<order>
  <orderReference>148933</orderReference>
  <status>Updated</status>
</order>
<order>
  <orderReference>148955</orderReference>
  <status>Updated</status>
</order>
<order>
  <orderReference>148956</orderReference>
  <status>Updated</status>
  <warnings>
    <warning>
      <warningCode>1116</warningCode>
      <warningMessage><![CDATA["Address is inaccurate"]]></warningMessage>
    </warning>
  </warnings>
</order>
<order>
  <orderReference>149025</orderReference>
  <status>Updated</status>
</order>
<order>
  <orderReference>149034</orderReference>
  <status>Updated</status>
</order>
</orders>


 Dim orderWithWarning = orders.Descendants("warnings") _
    .Select(Function(wr) New With { _
            .OrderReference =  wr.Parent.<orderReference>.Value, _
            .WarningCode = wr.<warning>.<warningCode>.Value, _
            .WarningMessage = wr.<warning>.<warningMessage>.Value _
            }).FirstOrDefault()

Возвращает Анонимный тип

0 голосов
/ 29 января 2019

Опция, которую вы можете использовать, - это создать функцию с именем GetXMLElement, которая будет возвращать целое XElement вместо единственного значения, затем вы можете перемещаться по его свойству Parent, чтобы найти, к которому оно присоединено.Например:

Private Shared Function GetXMLElement(xml As String, element As String) As XElement
    Try
        Dim xDoc As XDocument = XDocument.Parse(xml)
        Dim node = xDoc.Descendants().Where(Function(n) n.Name = element).FirstOrDefault()

        Return node
    Catch ex As Exception
        Return Nothing
    End Try
End Function

используется в соответствии с:

Dim warningCode = GetXMLElement(responseReceivedFromApi, "warningCode")
Dim warningMessage = GetXMLElement(responseReceivedFromApi, "warningMessage")

If (Not warningCode Is Nothing) Then
    Debug.Print(warningCode.Parent.Parent.Parent.ToString)
End If

Родитель warningCode элементов - warning, следующий родитель - warnings.Последний родительский элемент, который вас интересует, - это элемент order

, который выдаст:

<order>
  <orderReference>148956</orderReference>
  <status>Updated</status>
  <warnings>
    <warning>
      <warningCode>1116</warningCode>
      <warningMessage><![CDATA["Address is inaccurate"]]></warningMessage>
    </warning>
  </warnings>
</order>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...