Как получить значение узла XML на основе значения атрибута c #, asp.net? - PullRequest
1 голос
/ 26 мая 2019

как получить значение xmlnode на основе значения атрибута в C #.

<Products>
  <Error>0</Error>
  <Product link="OWN">
    <ProductCode>CA</ProductCode>
    <ProductType>Account</ProductType>
    <ProductSubtype>Current Account</ProductSubtype>
    <ProductDescriptionEng>Current Account</ProductDescriptionEng>  
    <ProductNumber>1234567</ProductNumber>
    <ProductCurrency></ProductCurrency>
    <ProductCurrencyCode>01</ProductCurrencyCode>
    <ProductBalance>899293.003</ProductBalance>
    <LoanRef></LoanRef>
    <OldLoanRef></OldLoanRef>
    <ProductStandardID>00010001</ProductStandardID>
    <OldLoanRef></OldLoanRef>  
    <ProductStatusCode>00</ProductStatusCode>
    <ProductStatus>OPEN</ProductStatus>
    <ProductCategory>Deposit Account</ProductCategory>   
  </Product>
</Product>

в приведенном выше примере я хотел бы получить значение Product Link "OWN" на основе значения атрибута передачи (1234567) 1234567.

Я пробовал следующий код, но он не 't возвращает значение «OWN» из узла «Product link».

string _accountsXml = GetProducts();
                _xmlDoc.LoadXml(_accountsXml);
                _productLinkType = _xmlDoc.SelectSingleNode(string.Format("//Products[../ProductNumber = '{0}']", prodNumber));

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Вам нужно добавить код, чтобы получить там значение атрибута элемента, возможно, учитывая случай, когда нужный элемент не был найден.Кроме того, будьте осторожны с именами элементов - как в выражении xpath, так и в XML.

В следующем тестовом коде в переменной ссылки будет "OWN":

var doc = XDocument.Parse(@"<?xml version=""1.0""?>  
<Products>
    <Error>0</Error>
    <Product link=""Global""/>
    <Product link=""OWN"">
        <Some/>
        <ProductNumber>1234567</ProductNumber>
        <Nodes/>
    </Product>
    <Product link=""External"">
        <ProductNumber>777</ProductNumber>
    </Product>
</Products>");

var id = 1234567;
var link = doc
    .XPathSelectElement($"//Product[ProductNumber = '{id}']")
    ?.Attribute("link")
    ?.Value;

Console.WriteLine($"Product link: {link ?? "not found"}");
1 голос
/ 26 мая 2019

Попробуйте это

_productLinkType = _xmlDoc.SelectSingleNode(string.Format("//Products[..//ProductNumber = '{0}']", prodNumber));

или

var xDoc = XDocument.Load(_accountsXml);
var productLinkType = xDoc.XPathSelectElement(string.Format("//Products[..//ProductNumber = '{0}']", prodNumber)).Element("Product").Attribute("link").Value;

Закрывающий тег в вашем примере: «Это должен быть продукт»

...