XDocumentを読み込むときに、私は、事前定義された名前空間を使用することはできますか?

StackOverflow https://stackoverflow.com/questions/879728

質問

私は、多くの場合、名前空間の要素が含まれているXML文書に対処する必要がありますが、名前空間を宣言していません。たとえばます:

<root>
  <a:element/>
</root>
「」名前空間URIを割り当てられることはありませんプレフィックスので

、文書は無効です。私は次のコードを使用して、このようなXMLドキュメントを読み込むときます:

using (StreamReader reader = new StreamReader(new FileStream(inputFileName,    
       FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) {
            doc = XDocument.Load(reader, LoadOptions.PreserveWhitespace);
}

これは、文書が宣言されていない名前空間が含まれており、整形式でないこと(当然)旨の例外をスローします。

だから、私はデフォルトの名前空間接頭辞を事前に定義することができます - >パーサの名前空間URIのペアは、上のフォールバックしますか? XmlNamespaceManagerは有望に見えるが、(私ができる場合は)このような状況に適用する方法を知りません。

役に立ちましたか?

解決

あなたは名前空間について知っているXmlReaderXmlParserContextを作成することができます。 XmlDocumentXDocumentについて次の作品ます:

class SimpleNameTable : XmlNameTable {
    List<string> cache = new List<string>();
    public override string Add(string array) {
        string found = cache.Find(s => s == array);
        if (found != null) return found;
        cache.Add(array);
        return array;
    }
    public override string Add(char[] array, int offset, int length) {
        return Add(new string(array, offset, length));
    }
    public override string Get(string array) {
        return cache.Find(s => s == array);
    }
    public override string Get(char[] array, int offset, int length) {
        return Get(new string(array, offset, length));
    }
}
static void Main() {
    XmlNamespaceManager mgr = new XmlNamespaceManager(new SimpleNameTable());
    mgr.AddNamespace("a", "http://foo/bar");
    XmlParserContext ctx = new XmlParserContext(null, mgr, null,
        XmlSpace.Default);
    using (XmlReader reader = XmlReader.Create(
        new StringReader(@"<root><a:element/></root>"), null, ctx)) {

        XDocument doc = XDocument.Load(reader);

        //XmlDocument doc = new XmlDocument();
        //doc.Load(reader);
    }
}

他のヒント

前の回答を踏まえ、あなたは常にXmlDocumentに最初のロードで名前空間接頭辞を維持し、XDocument

へのXmlDocumentのOuterXmlを解析することができます
XDocument LoadWithPrefix(Stream stream)
{
    XmlNamespaceManager mgr = new XmlNamespaceManager(new NameTable());
    mgr.AddNamespace("a", "http://foo/bar");
    XmlParserContext ctx = new XmlParserContext(null, mgr, null, XmlSpace.Default);
    using (XmlReader reader = XmlReader.Create(stream, null, ctx)) 
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        return XDocument.Parse(doc.OuterXml);
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top