1

私は問題があります。大量のデータをVML-GMLフォーマットに変換するプログラムを作成しました。問題は私が使用する必要があることXmlWriterです...今私は以下の私の方法に問題があります:

private void StartDocument()
{
    _writer.WriteStartDocument();
    _writer.WriteStartElement("osgb", "FeatureCollection", "osgb");
    _writer.WriteAttributeString("osgb", "xmlns", "http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1");
    _writer.WriteAttributeString("gml", "xmlns", "http://www.opengis.net/gml");
    _writer.WriteAttributeString("xsi", "xmlns", "http://www.w3.org/2001/XMLSchema-instance");
    _writer.WriteAttributeString("schemaLocation", "xsi",
                                 "http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1 http://www.ordnancesurvey.co.uk/oswebsite/xml/cmdschema/local/V1.1/CMDFeatures.xsd");
    _writer.WriteAttributeString("fid", ""); // TODO: set fid here

    _writer.WriteStartElement("gml", "description", "gml");
    _writer.WriteValue("Ordnance Survey, (c) Crown Copyright. All rights reserved, 2011-03-02");
    _writer.WriteEndElement(); // description

    _writer.WriteElementString("osgb", "creationDate", "osgb", DateTime.Today.ToString("yyyy-MM-dd"));
}

名前空間を正しく書き込む方法は?私はそのようにこれを行い、出力は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<osgb:FeatureCollection p1:osgb="http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1" 
p1:gml="http://www.opengis.net/gml"
p1:xsi="http://www.w3.org/2001/XMLSchema-instance" 
p2:schemaLocation="http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1 http://www.ordnancesurvey.co.uk/oswebsite/xml/cmdschema/local/V1.1/CMDFeatures.xsd"
fid="" xmlns:p2="xsi" xmlns:p1="xmlns" xmlns:osgb="osgb">

そして、これは私が必要なものです:

<osgb:FeatureCollection xmlns:osgb="http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1 http://www.ordnancesurvey.co.uk/oswebsite/xml/cmdschema/local/V1.1/CMDFeatures.xsd"
fid="">

、、XmlWriterなどのようなものを作成するのはなぜ愚かですか?p1p2

ところで。それらのファイルを使用するプログラムで出力ファイルを開こうとしVML-GMLましたが、ファイルの形式が正しくないと表示されました。名前空間を手動で正しい名前空間に変更したとき、すべてが素晴らしかった。

それを修正する方法は?前もって感謝します!

4

1 に答える 1

8

その愚かなXmlWriterがp1、p2などを作成するのはなぜですか?

属性値が間違った方向にあり、別の引数を指定する必要もあります。

これ:

_writer.WriteAttributeString("gml", "xmlns", "http://www.opengis.net/gml");

これである必要があります:

_writer.WriteAttributeString("xmlns", "gml", null, "http://www.opengis.net/gml");

さらに、要素の記述コードが正しくありません。名前空間URIを指定する必要がある場合は、プレフィックスを指定します。

私はこれがあなたが必要とすることをすることを信じます:

_writer.WriteStartDocument();
// The first argument here isn't really needed, but is changes whether a
// prefix is used or not
_writer.WriteStartElement("osgb", "FeatureCollection", "http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1");
_writer.WriteAttributeString("xmlns", "osgb", null, "http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1");
_writer.WriteAttributeString("xmlns", "gml", null, "http://www.opengis.net/gml");
_writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
_writer.WriteAttributeString("schemaLocation", "http://www.w3.org/2001/XMLSchema-instance",
                             "http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1 http://www.ordnancesurvey.co.uk/oswebsite/xml/cmdschema/local/V1.1/CMDFeatures.xsd");
_writer.WriteAttributeString("fid", ""); // TODO: set fid here

_writer.WriteStartElement("description", "http://www.opengis.net/gml");
_writer.WriteValue("Ordnance Survey, (c) Crown Copyright. All rights reserved, 2011-03-02");
_writer.WriteEndElement(); // description

_writer.WriteElementString("creationDate", "http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1", DateTime.Today.ToString("yyyy-MM-dd"));
_writer.WriteEndElement();

(個人的には、LINQ to XMLを使用します。これにより、これらすべてがはるかに簡単になりますが、ちょっと...)

ヒントとして、出発点として、フレームワークコードではなく、コードが間違っていると常に想定してください。フレームワーククラスを「愚か」と見なすと、自分のコードを十分に注意深く見ないことにつながる可能性があります。

編集:これがLINQ toXMLコードの動作です:

using System;
using System.Xml.Linq;

static class Test
{
    static void Main()
    {
        XNamespace osgb = "http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1";
        XNamespace gml = "http://www.opengis.net/gml";
        XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

        var doc = new XDocument(
            new XElement(osgb + "FeatureCollection",
               new XAttribute(XNamespace.Xmlns + "osgb", osgb),
               new XAttribute(XNamespace.Xmlns + "gml", gml),
               new XAttribute(XNamespace.Xmlns + "xsi", xsi),
               new XAttribute(xsi + "schemaLocation", "http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1 http://www.ordnancesurvey.co.uk/oswebsite/xml/cmdschema/local/V1.1/CMDFeatures.xsd"),
               new XAttribute("fid", ""),
               new XElement(gml + "description", "Ordnance Survey ..."),
               new XElement(osgb + "creationDate",
                            // TODO: Find a better way of doing this
                            DateTime.Today.ToString("yyyy-MM-dd"))));
        Console.WriteLine(doc);
   }
}

出力:

<osgb:FeatureCollection
    xmlns:osgb="http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1" 
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://namespaces.ordnancesurvey.co.uk/cmd/local/v1.1 http://www.ordnancesurvey.co.uk/oswebsite/xml/cmdschema/local/V1.1/CMDFeatures.xsd"
    fid="">
  <gml:description>Ordnance Survey ...</gml:description>
  <osgb:creationDate>2012-10-19</osgb:creationDate>
</osgb:FeatureCollection>
于 2012-10-19T14:45:15.303 に答える