Как я могу разобрать XML do c в список строк с помощью Linq - PullRequest
0 голосов
/ 05 мая 2020

Пытаюсь разобрать разделы XML документа ниже, чтобы найти все URL-адреса в разделе IdentificationID и поместить их в список строк, но я не могу найти правильную комбинацию между потомками и элементами, чтобы заставить его работать. Я попробовал приведенный ниже код, но ничего не нашел.

Код:

    List<CodeTableUrl> lUrls = new List<CodeTableUrl>();

    XDocument elements = XDocument.Parse(sPayload);
    XNamespace dataSet_nc = "http://niem.gov/niem/niem-core/2.0";
    lUrls = (from d in elements.Descendants("RuntimePolicyParameters")
                                      select new CodeTableUrl
                                      {
                                        sUrl = (String)d.Element("CourtCodelist").Element("CourtCodelistURI").Element(dataSet_nc + "IdentificationID") ?? ""
                                      }).ToList(); 

    foreach( CodeTableUrl url in lUrls )
        Console.WriteLine(url.sUrl);

    public class CodeTableUrl
    {
        public String sUrl { get; set; }
    }

XML Документ:

    <PolicyResponseMessage xmlns="urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:CourtPolicyResponseMessage-4.0" xmlns:j="http://niem.gov/niem/domains/jxdm/4.0" xmlns:nc="http://niem.gov/niem/niem-core/2.0" xmlns:mark="urn:mark:ecf:extensions:Common" xmlns:ecf="urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:CommonTypes-4.0">
      <RuntimePolicyParameters>
        <CourtCodelist>
          <ECFElementName>nc:CaseCategoryText</ECFElementName>
          <EffectiveDate>
            <nc:Date>2012-10-10</nc:Date>
          </EffectiveDate>
          <CourtCodelistURI>
            <nc:IdentificationID>https://Test1.com</nc:IdentificationID>
          </CourtCodelistURI>
        </CourtCodelist>
        <CourtCodelist>
          <ECFElementName>mark:CaseTypeText</ECFElementName>
          <EffectiveDate>
            <nc:Date>2012-10-10</nc:Date>
          </EffectiveDate>
          <CourtCodelistURI>
            <nc:IdentificationID>https://Test2.com</nc:IdentificationID>
          </CourtCodelistURI>
        </CourtCodelist>
      </RuntimePolicyParameters>
    </PolicyResponseMessage>

Ожидаемый вывод списка:

    https://Test1.com
    https://Test2.com

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Проблема в том, что вы ищете XML элементы без указания их пространства имен. Узлы RuntimePolicyParameters, CourtCodelist и CourtCodelistURI находятся в пространстве имен urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:CourtPolicyResponseMessage-4.0. Чтобы найти эти элементы, необходимо указать это пространство имен:

List<CodeTableUrl> lUrls = new List<CodeTableUrl>();

XDocument elements = XDocument.Parse(sPayload);
string dataSet_nc = "http://niem.gov/niem/niem-core/2.0";
string ns = "urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:CourtPolicyResponseMessage-4.0";

lUrls = elements.Descendants(XName.Get("RuntimePolicyParameters", ns))
    .Elements(XName.Get("CourtCodelist", ns))
    .Select(d => new CodeTableUrl
            {
                sUrl = (String) d
                    .Element(XName.Get("CourtCodelistURI", ns))
                    .Element(XName.Get("IdentificationID", dataSet_nc)) ?? ""
            }).ToList();

foreach (CodeTableUrl url in lUrls)
    Console.WriteLine(url.sUrl);

После внесения соответствующих изменений программа выдаст следующий результат:

https://Test1.com
https://Test2.com

Вот полный образец .

0 голосов
/ 05 мая 2020

Вы неправильно используете пространство имен. Xml имеет больше пространства имен, и вам нужно использовать необходимое для текущего элемента

Я добавил базовое пространство имен xmlns, и все работает =)

    XDocument elements = XDocument.Parse(sPayload);
    XNamespace dataSet_nc = "http://niem.gov/niem/niem-core/2.0";
    XNamespace baseNs = "urn:oasis:names:tc:legalxml-courtfiling:schema:xsd:CourtPolicyResponseMessage-4.0";

    IEnumerable<CodeTableUrl> urlList = elements
                                        .Descendants(baseNs+"CourtCodelist")
                                        .Select(r => new CodeTableUrl
                                        {
                                            ECFElementName = r.Element(baseNs + "ECFElementName")?.Value,
                                            Url = r.Element(baseNs+"CourtCodelistURI")?.Element(dataSet_nc + "IdentificationID")?.Value,
                                            EffectiveDate = r.Element(baseNs+"EffectiveDate")?.Element(dataSet_nc + "Date")?.Value,
                                        });
    foreach (var item in urlList)
    {
        Console.WriteLine(item.Url);
    }

Вы, кошка, попробуйте dotnetfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...