다음과 같은 네임 스페이스가있는 XML 파일이있는 경우
<root>
<h:table xmlns:h="http://www.namespaces.com/namespaceOne">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<h:table xmlns:h="https://www.namespaces.com/namespaceTwo">
<h:name>African Coffee Table</h:name>
<h:width>80</h:width>
<h:length>120</h:length>
</h:table>
</root>
다음과 같이 모든 네임 스페이스를 루트 요소로 끌어 올리고 싶습니다.
<root xmlns:h="http://www.namespaces.com/namespaceOne" xmlns:h1="https://www.namespaces.com/namespaceTwo">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<h1:table>
<h1:name>African Coffee Table</h1:name>
<h1:width>80</h1:width>
<h1:length>120</h1:length>
</h1:table>
</root>
이를 수행하는 방법이 있습니까? 위의 예에서와 같이 충돌하는 네임 스페이스 접두사를 자동으로 해결하는 것이 이상적입니다. 나는 사용하기 위해 최선을 다하고하지 않은 XML Linq에를 하거나 에서 System.Xml 가능성이 될 것입니다 그러니, 아직.
한 가지 주요 제약 사항이 있습니다. 작업중인 환경 때문에 클래스를 작성할 수 없습니다. 함수를 작성할 수 있지만 새로운 클래스 정의는 없습니다.
이것은 매우 간단합니다.
var doc = XDocument.Parse(xml);
var namespaceAttributes = doc.Descendants()
.SelectMany(x => x.Attributes())
.Where(x => x.IsNamespaceDeclaration);
int count = 1;
foreach (var namespaceAttribute in namespaceAttributes)
{
doc.Root.Add(new XAttribute(XNamespace.Xmlns + $"h{count}", namespaceAttribute.Value));
namespaceAttribute.Remove();
count++;
}
모든 네임 스페이스 선언 ( xmlns:foo="foo"
)을 반복합니다 . 우리가 찾은 각각에 대해 동일한 URL을 가진 네임 스페이스 속성을 루트 요소에 넣고 제거합니다.
데모 .
동일한 URL을 가진 여러 네임 스페이스가있는 경우 (예 xmlns:h="https://www.namespaces.com/namespaceOne"
: 서로 다른 자식에 대해 두 개의 로트가있는 경우) 약간 이상한 일을 수행합니다. 동일한 URL을 가진 xmlns
루트 요소에 여러 선언을 넣지 만 모든 요소는 마지막 네임 스페이스를 사용합니다. . 이를 방지하려면 루트 요소에 추가 한 네임 스페이스 목록을 유지하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다