MKM_Matt Ответов: 1

Запрос преобразования Xml,


Привет. Без сомнения, это легко для Вас, экспертов.
У меня есть XML, который мне нужно преобразовать в другой XML, взяв некоторые элементы и записав их в новые элементы и т. д...
Я значительно сократил файл, надеюсь, достаточно, чтобы вы указали мне правильное направление.

<?xml version="1.0" encoding="utf-8"?>
<kmsg xmlns:env="http://xml.changedthisbit" xmlns="http://xml.changedthisbit">
  <header>
    <env:envelope>
      <env:payload>ORDER</env:payload>
      <env:cfcompany>01</env:cfcompany>
      <env:service>LIVE</env:service>
      <env:source branch="" endpoint="" machine="" password="" />
      <env:destination branch="0002" endpoint="" machine="" />
    </env:envelope>
  </header>
  <body>
    <Order xmlns="urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01">
      <OrderDate>2012-08-08T09:40:00</OrderDate>
      <Extensions>
        <WebOrder>true</WebOrder>
      </Extensions>
      <OrderLine Action="Add" TypeCode="New" TypeDescription="New Item">
         <Product>
            <ProductId>1234</ProductId>
         </Product>
      </OrderLine>
      <OrderLine Action="Add" TypeCode="New" TypeDescription="New Item">
         <Product>
            <ProductId>9876</ProductId>
         </Product>
      </OrderLine>
    </Order>
   </body>
</kmsg>


У меня возникли проблемы с простым выводом даты заказа. Я просто получаю этот вывод.
<?xml version="1.0" encoding="iso-8859-1"?>


Я еще не начинал с каждой строки заказа....

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

Что я уже пробовал:

У меня есть эта трансформация:-
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output encoding="iso-8859-1"/>
	<xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
	<xsl:template match="/">

	<header>
	</header>
	<body>
		<xsl:value-of select = "kmsg/body/Order/OrderDate"/>
	</body>
	</xsl:template>
</xsl:stylesheet>

1 Ответов

Рейтинг:
2

RickZeeland

Я переформатировал xml на это:

<?xml version="1.0" encoding="utf-8"?>
  <body>
    <Order>
      <OrderDate>2012-08-08T09:40:00</OrderDate>
      <Extensions>
        <WebOrder>true</WebOrder>
      </Extensions>
      <OrderLine Action="Add" TypeCode="New" TypeDescription="New Item">
         <Product>
            <ProductId>1234</ProductId>
         </Product>
      </OrderLine>
      <OrderLine Action="Add" TypeCode="New" TypeDescription="New Item">
         <Product>
            <ProductId>9876</ProductId>
         </Product>
      </OrderLine>
    </Order>
   </body>

А потом запустил этот код:
XElement _x = XElement.Load(@"order.xml");
var orders = from el in _x.Elements("Order") select el;

foreach (var order in orders)
{
    Debug.Print(order.Element("OrderDate").Value);
}

Вы можете очистить XML в автоматическом режиме, как это:
 XDocument doc = XDocument.Load("order.xml");

 // Strip namespace...
 foreach (var node in doc.Root.Descendants()
                         .Where(n => n.Name.NamespaceName == "urn:schemas-basda-org:2000:purchaseOrder:xdr:3.01"))
 {
     // Remove the xmlns='' attribute.
     node.Attributes("xmlns").Remove();
     node.Name = node.Parent.Name.Namespace + node.Name.LocalName;
 }

Debug.Print(doc.ToString());     // Or doc.Save(...)


MKM_Matt

Привет, Рикзиленд. Большое спасибо. Я надеюсь получить окончательное решение в XML transform (.xsl), а не в коде, то есть моя система вызовет преобразование и загрузит полученный XML, а затем разберется с ним. Есть ли способ сделать это? Хотя я буду иметь в виду ваше решение, если мне придется пойти по пути выполнения всего этого в коде, то есть прочитать XML и построить новый XML из этого.

RickZeeland

Это кажется правильным решением, но, к сожалению, у меня нет никакого опыта в преобразовании XML, может быть, это поможет: https://stackoverflow.com/questions/18872689/best-way-to-fix-malformed-html-for-use-in-an-xsl-transform