1

新しいXMLDocument内のいくつかのxmlnodeにプレフィックスを追加しようとしています(ファイルからロードされていないなど、最初から100%作成されています)。

簡単に言えば、私はこれを持っています:

XmlDocument doc = new XmlDocument();
XmlElement RootElement = (XmlElement)doc.AppendChild(doc.CreateElement("root"));
foreach (string line in CSV)
{
    XmlElement navPointElement = (XmlElement) RootElement.AppendChild(doc.CreateElement("navPoint"));
    XmlElement navPointTypeElement =(XmlElement) navPointElement.AppendChild(doc.CreateElement("type"));
    navPointTypeElement.Prefix = "acp";
    navPointTypeElement.InnerText = nodeCount == 0 ? "cover" : "article";
}

はるかに多くのコードがありますが、これは私が何をしているのかをあなたに教えてくれます。これで、ドキュメントは正常に出力されますが、プレフィックス宣言を完全にスキップします。名前空間の定義について読んだことがありますが、次のことを試みても無駄になりました。

XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("acp", "http://www.namespace.com");

簡単なことだと思いますが、ドキュメントが見つかりません。xmldocumentプレフィックスのMSDNドキュメントは、名前空間を必要とせずに行ったのとほぼ同じようにプレフィックスを追加するだけです(または、少なくともコードサンプルでの表示方法です)。

どんな助けでも大歓迎です:)

4

2 に答える 2

4

ええと、名前空間が必要です。プレフィックスが行うべき名前空間にマップされないため、のようなもの<acp:type/>はそれ自体では無効です。acp

あなたがする必要があるのは、要素のCreateElementの呼び出しで追加したい要素に名前空間を設定することですtype

public class StackOverflow_10807173
{
    public static void Test()
    {
        XmlDocument doc = new XmlDocument();
        XmlElement RootElement = (XmlElement)doc.AppendChild(
            doc.CreateElement("root"));
        string[] CSV = "hello world how are you".Split(' ');
        int nodeCount = 0;
        XmlAttribute xmlnsAttr = doc.CreateAttribute(
            "xmlns", "acp", "http://www.w3.org/2000/xmlns/");
        string acpNamespace = "http://www.namespace.com";
        xmlnsAttr.Value = acpNamespace;
        RootElement.Attributes.Append(xmlnsAttr);
        foreach (string line in CSV)
        {
            XmlElement navPointElement = (XmlElement)RootElement.AppendChild(
                doc.CreateElement("navPoint"));
            XmlElement navPointTypeElement = (XmlElement)navPointElement.AppendChild(
                doc.CreateElement("type", acpNamespace)); // namespace here
            navPointTypeElement.Prefix = "acp";
            navPointTypeElement.InnerText = nodeCount == 0 ? "cover" : "article";
        }

        Console.WriteLine(doc.OuterXml);
    }
}

注:ルート要素に名前空間を追加する必要はありません。そうしないと、xmlns:acp="yournamespace"すべてのtype要素に属性が含まれることになります(そのプレフィックスはスコープ内にないため)。親要素に追加すると、子要素に追加する必要がなくなります。

于 2012-05-29T22:07:25.340 に答える
1

同様の問題が発生し、組み込みの.NETSystem.XMLオブジェクトが必要な処理を実行できないことがわかりました。

NAXMLマークアップを使用して、POSシステムで燃料価格の変更レコードを作成する必要がありました。 一部の要素には「 nax」プレフィックスが必要でしたが、他の要素には必要ありませんでした。System.Xmlオブジェクトは、それをすべての要素に追加するか、または追加しないように見えました。必要な要素にそれらを適用するだけではうまくいきませんでした。

System.XMLオブジェクトでは必要な詳細な制御が得られなかったため、System.Text.StringBuilderを使用してXmlを手動で書き出す必要がありました。

それを行う方法のアイデアを与えるための私のアプリからのサンプルコード:

System.Text.StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n");
sb.Append("<FuelPriceMaintenanceRequest xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://www.POSVENDOR.com/NAXML-Extension\" xmlns:nax=\"http://www.naxml.org/POSBO/Vocabulary/2003-10-16\" xsi:schemaLocation=\"http://www.POSVENDOR.com/NAXML-Extension FuelPriceMaintenance.xsd\">\r\n");
sb.Append("  <nax:TransmissionHeader>\r\n");
sb.Append("    <nax:StoreLocationID>" + StoreNumber.ToString() + "</nax:StoreLocationID>\r\n");
sb.Append("  </nax:TransmissionHeader>\r\n");
...snip...
sb.Append("</FuelPriceMaintenanceRequest>");
于 2012-05-29T21:55:23.003 に答える