консолидировать пространства имен xml - PullRequest
0 голосов
/ 30 августа 2011

У меня есть следующий xml.

Пространства имен очень разбиты, но сам xml действителен. Есть ли способ настроить писателя для вывода этого XML со всеми соответствующими пространствами имен в верхней части, и очиститель XML? Мои комбинации читателя / писателя в формате xml, похоже, верно воспроизводят это. Я бы предпочел объединить все пространства имен.

Я действительно не хочу использовать xslt, если это возможно.

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:a="http://www.w3.org/2005/Atom/extensions/property" a:length="1">
    <title type="text">Search Results: '80706'</title>
    <subtitle type="text">search results</subtitle>
    <id>80706</id>
    <updated>2011-08-30T09:05:21+02:00</updated>
    <author>
        <name>XXXXXX</name>
        <uri>contact@xxxx</uri>
        <email>contact@xxxx.com</email>
    </author>
    <entry">
        <id>8000</id>
        <title type="text">Investment 0000000</title>
        <summary type="text">pre populated form</summary>
        <published>2011-08-30T14:57:45Z</published>
        <updated>2011-08-30T09:05:21+02:00</updated>
        <content type="application/xml">
            <prop:query-result xmlns:prop="http://www.w3.org/2005/Atom/extensions/property" xmlns="http://www.w3.org/2005/Atom/extensions/property">
                <prop:PartyId>000000</prop:PartyId>
                <prop:IDReferenceNumber>000000</prop:IDReferenceNumber>
                <prop:FullName></prop:FullName>
                <prop:FirstName>FIRST</prop:FirstName>
                <prop:LastName>LAST</prop:LastName>
                <prop:Title>Mr</prop:Title>
                <prop:BirthDate>1967-05-24T00:00:00</prop:BirthDate>
                <prop:PartySystemKey source="Number">000000</prop:PartySystemKey>
                <prop:Address type="Mailing">BOX ...</prop:Address>
                <prop:Address type="Home">39 ...</prop:Address>
                <prop:ContactNumber>0000000</prop:ContactNumber>
                <prop:InvestmentNumber source="ContractNumber">0000000</prop:InvestmentNumber>
                <prop:InvestmentNumber source="AccountNumber">0000000</prop:InvestmentNumber>
            </prop:query-result>
        </content>
    </entry>
</feed>

1 Ответ

2 голосов
/ 30 августа 2011

Что ж, XmlReader работает только вперед, поэтому найти комбинацию пространств имен в любом месте, чтобы поместить их в корень, сложно с помощью комбинации XmlReader / Writer.Однако вы можете попробовать LINQ to XML, когда я запускаю код (.NET 4.0)

    XDocument feed = XDocument.Load(@"input.xml");
    feed.Root.Descendants().Attributes().Where(a => a.IsNamespaceDeclaration && feed.Root.Attributes().Any(a2 => a.Value == a2.Value)).Remove();
    feed.Save(Console.Out, SaveOptions.OmitDuplicateNamespaces);

на примере ввода

<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:a="http://www.w3.org/2005/Atom/extensions/property" a:length="1">
  <title type="text">Search Results: '80706'</title>
  <subtitle type="text">search results</subtitle>
  <id>80706</id>
  <updated>2011-08-30T09:05:21+02:00</updated>
  <author>
    <name>XXXXXX</name>
    <uri>contact@xxxx</uri>
    <email>contact@xxxx.com</email>
  </author>
  <entry>
    <id>8000</id>
    <title type="text">Investment 0000000</title>
    <summary type="text">pre populated form</summary>
    <published>2011-08-30T14:57:45Z</published>
    <updated>2011-08-30T09:05:21+02:00</updated>
    <content type="application/xml">
      <prop:query-result xmlns:prop="http://www.w3.org/2005/Atom/extensions/property" xmlns="http://www.w3.org/2005/Atom/extensions/property">
        <prop:PartyId>000000</prop:PartyId>
        <prop:IDReferenceNumber>000000</prop:IDReferenceNumber>
        <prop:FullName></prop:FullName>
        <prop:FirstName>FIRST</prop:FirstName>
        <prop:LastName>LAST</prop:LastName>
        <prop:Title>Mr</prop:Title>
        <prop:BirthDate>1967-05-24T00:00:00</prop:BirthDate>
        <prop:PartySystemKey source="Number">000000</prop:PartySystemKey>
        <prop:Address type="Mailing">BOX ...</prop:Address>
        <prop:Address type="Home">39 ...</prop:Address>
        <prop:ContactNumber>0000000</prop:ContactNumber>
        <prop:InvestmentNumber source="ContractNumber">0000000</prop:InvestmentNumber>
        <prop:InvestmentNumber source="AccountNumber">0000000</prop:InvestmentNumber>
      </prop:query-result>
    </content>
  </entry>
</feed>

Я получаю вывод

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:a="http://www.w3.org/2005/Atom/extensions/property" a:length="1">
  <title type="text">Search Results: '80706'</title>
  <subtitle type="text">search results</subtitle>
  <id>80706</id>
  <updated>2011-08-30T09:05:21+02:00</updated>
  <author>
    <name>XXXXXX</name>
    <uri>contact@xxxx</uri>
    <email>contact@xxxx.com</email>
  </author>
  <entry>
    <id>8000</id>
    <title type="text">Investment 0000000</title>
    <summary type="text">pre populated form</summary>
    <published>2011-08-30T14:57:45Z</published>
    <updated>2011-08-30T09:05:21+02:00</updated>
    <content type="application/xml">
      <a:query-result>
        <a:PartyId>000000</a:PartyId>
        <a:IDReferenceNumber>000000</a:IDReferenceNumber>
        <a:FullName></a:FullName>
        <a:FirstName>FIRST</a:FirstName>
        <a:LastName>LAST</a:LastName>
        <a:Title>Mr</a:Title>
        <a:BirthDate>1967-05-24T00:00:00</a:BirthDate>
        <a:PartySystemKey source="Number">000000</a:PartySystemKey>
        <a:Address type="Mailing">BOX ...</a:Address>
        <a:Address type="Home">39 ...</a:Address>
        <a:ContactNumber>0000000</a:ContactNumber>
        <a:InvestmentNumber source="ContractNumber">0000000</a:InvestmentNumber>

        <a:InvestmentNumber source="AccountNumber">0000000</a:InvestmentNumber>
      </a:query-result>
    </content>
  </entry>
</feed>

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

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