diff --git a/src/AngleSharp.Xml.Tests/Parser/XmlParsing.cs b/src/AngleSharp.Xml.Tests/Parser/XmlParsing.cs index 82b4ca9..1d3a6ca 100644 --- a/src/AngleSharp.Xml.Tests/Parser/XmlParsing.cs +++ b/src/AngleSharp.Xml.Tests/Parser/XmlParsing.cs @@ -1,3 +1,7 @@ +using System.Linq; +using System.Threading.Tasks; +using AngleSharp.Dom; + namespace AngleSharp.Xml.Tests.Parser { using AngleSharp.Xml.Parser; @@ -147,6 +151,15 @@ public void ParseInvalidXmlShouldNotThrowWhenSuppressingErrors_Issue14() }); } + [Test] + public async Task NamespaceDeclarationsInAttributesShouldNotCareAboutOrdering() + { + var document = @"1" + .ToXmlDocument(); + var root = document.DocumentElement; + Assert.AreEqual("http://www.idpf.org/2007/ops", + root.Attributes.First(att => att.LocalName == "type").NamespaceUri); + [Test] public async Task XmlPrefixedAttributesShouldLocateXmlNamespaceWithoutDeclaration() { diff --git a/src/AngleSharp.Xml/Parser/XmlDomBuilder.cs b/src/AngleSharp.Xml/Parser/XmlDomBuilder.cs index da87479..3f19f88 100644 --- a/src/AngleSharp.Xml/Parser/XmlDomBuilder.cs +++ b/src/AngleSharp.Xml/Parser/XmlDomBuilder.cs @@ -1,3 +1,5 @@ +using System.Linq; + namespace AngleSharp.Xml.Parser { using AngleSharp.Dom; @@ -274,9 +276,23 @@ private void InBody(XmlToken token) var element = CreateElement(tagToken.Name, tagToken.IsSelfClosing); CurrentNode.AppendChild(element); - for (var i = 0; i < tagToken.Attributes.Count; i++) + var namespaceDeclarations = tagToken.Attributes + .Where(attr => attr.Key.StartsWith("xmlns")) + .ToList(); + var otherAttributes = tagToken.Attributes + .Where(attr => !attr.Key.StartsWith("xmlns")) + .ToList(); + + for (var i = 0; i < namespaceDeclarations.Count; i++) + { + var attr = namespaceDeclarations[i]; + var item = CreateAttribute(attr.Key, attr.Value.Trim()); + element.AddAttribute(item); + } + + for (var i = 0; i < otherAttributes.Count; i++) { - var attr = tagToken.Attributes[i]; + var attr = otherAttributes[i]; var item = CreateAttribute(attr.Key, attr.Value.Trim()); element.AddAttribute(item); }